{"mappings":"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","sources":["packages/react-aria/src/interactions/createKeyboardShortcutHandler.ts"],"sourcesContent":["/*\n * Copyright 2025 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {isMac} from '../utils/platform';\nimport {KeyboardEvent} from '@react-types/shared';\n\nexport type KeyboardShortcutAction = (\n  e: KeyboardEvent\n) =>\n  | void\n  | boolean\n  | Partial<{shouldContinuePropagation?: boolean; shouldPreventDefault?: boolean}>;\n\n/** Maps shortcut strings (e.g. `\"Mod+s\"`, `\"Control+Shift+a\"`) to handlers. */\nexport type KeyboardShortcutBindings = Record<string, KeyboardShortcutAction>;\n\n/** Modifier names in shortcut strings (case-insensitive). Order in the string does not matter. */\nconst MODIFIER_NAMES = new Set([\n  'shift',\n  'alt',\n  'control',\n  'meta',\n  'mod' // OS dependent - Cmd on Mac, Control on Windows/Linux\n]);\n\n/** Canonical modifier order for stable keys (sorted, fixed order). */\nconst CANONICAL_MODIFIER_ORDER = ['Alt', 'Control', 'Meta', 'Shift'] as const;\n\nexport interface ParsedKeyboardShortcut {\n  shift: boolean;\n  alt: boolean;\n  ctrl: boolean;\n  meta: boolean;\n  /**\n   * Platform primary: Cmd on Mac, Control on Windows/Linux — expands to Meta or Control in\n   * canonical form.\n   */\n  mod: boolean;\n  key: string;\n}\n\n/**\n * Builds the set of canonical modifier tokens for a binding.\n * `Mod` contributes Meta (Mac) or Ctrl (non-Mac); explicit Ctrl/Meta add those keys too.\n */\nexport function modifierSetFromParsed(parsed: ParsedKeyboardShortcut): Set<string> {\n  let set = new Set<string>();\n  if (parsed.alt) {\n    set.add('Alt');\n  }\n  if (parsed.shift) {\n    set.add('Shift');\n  }\n  if (parsed.ctrl) {\n    set.add('Control');\n  }\n  if (parsed.meta) {\n    set.add('Meta');\n  }\n  if (parsed.mod) {\n    set.add(isMac() ? 'Meta' : 'Control');\n  }\n  return set;\n}\n\n/** Modifier set from a keydown event (native flags only). */\nexport function modifierSetFromEvent(e: KeyboardEvent): Set<string> {\n  let set = new Set<string>();\n  if (e.altKey) {\n    set.add('Alt');\n  }\n  if (e.ctrlKey) {\n    set.add('Control');\n  }\n  if (e.metaKey) {\n    set.add('Meta');\n  }\n  if (e.shiftKey) {\n    set.add('Shift');\n  }\n  return set;\n}\n\nfunction sortedModifierTokens(set: Set<string>): string[] {\n  return CANONICAL_MODIFIER_ORDER.filter(name => set.has(name));\n}\n\n/**\n * Parses a shortcut like `\"Mod+Shift+z\"`, `\"Ctrl+Alt+Enter\"`, or `\"Escape\"`.\n * Modifiers are case-insensitive; order does not matter. `control` is an alias for `ctrl`.\n */\nexport function parseKeyboardShortcut(spec: string): ParsedKeyboardShortcut {\n  let parts = spec.split('+').reduce<ParsedKeyboardShortcut>(\n    (prev, part) => {\n      let lower = part.toLowerCase();\n      if (MODIFIER_NAMES.has(lower)) {\n        if (lower === 'shift') {\n          prev.shift = true;\n        } else if (lower === 'alt') {\n          prev.alt = true;\n        } else if (lower === 'control') {\n          prev.ctrl = true;\n        } else if (lower === 'meta') {\n          prev.meta = true;\n        } else if (lower === 'mod') {\n          prev.mod = true;\n        }\n      } else {\n        prev.key = part;\n      }\n      return prev;\n    },\n    {shift: false, alt: false, ctrl: false, meta: false, mod: false, key: ''}\n  );\n  if (parts.key === '') {\n    throw new Error(\n      `Invalid keyboard shortcut: \"${spec}\". Must include exactly one non-modifier key (e.g. \"a\", \"Enter\", \"ArrowDown\"). Combine any of Shift, Alt, Ctrl, Meta, and Mod.`\n    );\n  }\n  return parts;\n}\n\nfunction normalizeEventKey(key: string): string {\n  return key.toLowerCase();\n}\n\n/** Short aliases for common keys (shortcut side, before match). */\nconst KEY_ALIASES: Record<string, string> = {\n  space: ' ',\n  esc: 'escape',\n  del: 'delete',\n  ins: 'insert',\n  left: 'arrowleft',\n  right: 'arrowright',\n  up: 'arrowup',\n  down: 'arrowdown',\n  pageup: 'pageup',\n  pagedown: 'pagedown'\n};\n\n/** Canonical key segment (lowercase); aliases like `down` → `arrowdown`. */\nfunction canonicalKeyFromSpecKey(specKey: string): string {\n  let k = normalizeEventKey(specKey);\n  let aliased = KEY_ALIASES[k];\n  return aliased != null ? aliased : k;\n}\n\n/** Canonical shortcut string for a binding (modifiers sorted: Alt, Ctrl, Meta, Shift, then key). */\nexport function canonicalKeyboardShortcut(parsed: ParsedKeyboardShortcut): string {\n  let mods = sortedModifierTokens(modifierSetFromParsed(parsed));\n  let key = canonicalKeyFromSpecKey(parsed.key);\n  return mods.length > 0 ? `${mods.join('+')}+${key}` : key;\n}\n\n/** Canonical shortcut string for a keydown event. */\nexport function keyboardEventToCanonicalShortcut(e: KeyboardEvent): string {\n  let mods = sortedModifierTokens(modifierSetFromEvent(e));\n  let key = normalizeEventKey(e.key);\n  let prefix = mods.length > 0 ? `${mods.join('+')}+` : '';\n  return prefix + key;\n}\n\n/**\n * Returns a keydown handler that runs the action only for an exact modifier+key match.\n * Modifier order in the string does not matter (`Shift+Mod+a` ≡ `Mod+Shift+a`).\n * Any combination of **Shift**, **Alt**, **Ctrl**, **Meta**, and **Mod** is allowed; **Mod** means\n * Cmd on Apple platforms and Ctrl on Windows/Linux (same as before). **control** aliases **ctrl**.\n *\n * Duplicate bindings that normalize to the same shortcut: later object entries win.\n *\n * @example\n *   ```tsx\n *   let onKeyDown = createKeyboardShortcutHandler({\n *     'Mod+s': e => {\n *       e.preventDefault();\n *       save();\n *     },\n *     'Ctrl+Shift+k': () => palette(),\n *     'Meta+Alt+ArrowLeft': () => back()\n *   });\n *   ```;\n */\nexport function createKeyboardShortcutHandler(\n  bindings: KeyboardShortcutBindings\n): (e: KeyboardEvent) => void {\n  let map = new Map<string, KeyboardShortcutAction>();\n  for (let [spec, action] of Object.entries(bindings)) {\n    let parsed = parseKeyboardShortcut(spec);\n    map.set(canonicalKeyboardShortcut(parsed), action);\n  }\n\n  return (e: KeyboardEvent) => {\n    let canonical = keyboardEventToCanonicalShortcut(e);\n    let action = map.get(canonical);\n    let result = action?.(e);\n    if (result === undefined && action !== undefined) {\n      result = {shouldContinuePropagation: false, shouldPreventDefault: true};\n    } else if (typeof result === 'boolean') {\n      result = {shouldContinuePropagation: !result, shouldPreventDefault: result};\n    }\n    if (result?.shouldPreventDefault) {\n      e.preventDefault();\n    }\n    if (!action || result?.shouldContinuePropagation) {\n      e.continuePropagation();\n    }\n  };\n}\n"],"names":[],"version":3,"file":"createKeyboardShortcutHandler.mjs.map"}