{"version":3,"file":"ngwr-hotkey.mjs","sources":["../../../projects/lib/hotkey/parse-spec.ts","../../../projects/lib/hotkey/wr-hotkey.ts","../../../projects/lib/hotkey/wr-hotkey-binding.ts","../../../projects/lib/hotkey/ngwr-hotkey.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport type { WrHotkeySpec } from './interfaces';\n\n/** Map of user-friendly aliases to canonical `KeyboardEvent.key` strings. */\nconst KEY_ALIASES: Readonly<Record<string, string>> = {\n  esc: 'escape',\n  space: ' ',\n  spacebar: ' ',\n  enter: 'enter',\n  return: 'enter',\n  up: 'arrowup',\n  down: 'arrowdown',\n  left: 'arrowleft',\n  right: 'arrowright',\n  del: 'delete',\n};\n\n/** Normalised representation of a hotkey spec — easy to match against an event. */\ninterface WrParsedHotkey {\n  readonly ctrl: boolean;\n  readonly alt: boolean;\n  readonly shift: boolean;\n  readonly meta: boolean;\n  /** Lowercased `KeyboardEvent.key` value the spec matches. */\n  readonly key: string;\n}\n\n/**\n * Parse a hotkey spec like `'mod+shift+k'` into a normalised structure.\n *\n * @param spec - the spec to parse\n * @param isMac - when true, `mod` resolves to `meta` (Cmd); otherwise `ctrl`\n */\nfunction parseHotkeySpec(spec: WrHotkeySpec, isMac = false): WrParsedHotkey {\n  const tokens = spec\n    .split('+')\n    .map(t => t.trim().toLowerCase())\n    .filter(Boolean);\n\n  let ctrl = false;\n  let alt = false;\n  let shift = false;\n  let meta = false;\n  let key = '';\n\n  for (const token of tokens) {\n    switch (token) {\n      case 'ctrl':\n      case 'control':\n        ctrl = true;\n        break;\n      case 'alt':\n      case 'option':\n        alt = true;\n        break;\n      case 'shift':\n        shift = true;\n        break;\n      case 'cmd':\n      case 'command':\n      case 'meta':\n      case 'super':\n      case 'win':\n        meta = true;\n        break;\n      case 'mod':\n        if (isMac) meta = true;\n        else ctrl = true;\n        break;\n      default:\n        key = KEY_ALIASES[token] ?? token;\n        break;\n    }\n  }\n\n  return { ctrl, alt, shift, meta, key };\n}\n\n/** Does `event` satisfy the parsed hotkey? */\nfunction matchesHotkey(event: KeyboardEvent, parsed: WrParsedHotkey): boolean {\n  if (event.ctrlKey !== parsed.ctrl) return false;\n  if (event.altKey !== parsed.alt) return false;\n  if (event.shiftKey !== parsed.shift) return false;\n  if (event.metaKey !== parsed.meta) return false;\n  return event.key.toLowerCase() === parsed.key;\n}\n\nexport { parseHotkeySpec, matchesHotkey };\nexport type { WrParsedHotkey };\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { DOCUMENT } from '@angular/common';\nimport { Service, NgZone, inject } from '@angular/core';\n\nimport { WrPlatform } from 'ngwr/platform';\n\nimport type { WrHotkeyHandle, WrHotkeyOptions, WrHotkeySpec } from './interfaces';\nimport { matchesHotkey, parseHotkeySpec, type WrParsedHotkey } from './parse-spec';\n\ninterface Binding {\n  readonly parsed: WrParsedHotkey;\n  readonly handler: (event: KeyboardEvent) => void;\n  readonly options: Required<WrHotkeyOptions>;\n}\n\nconst FALLBACK_OPTIONS: Required<WrHotkeyOptions> = {\n  element: undefined as unknown as HTMLElement,\n  preventDefault: true,\n  allowInInput: false,\n  priority: 0,\n};\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n  if (!(target instanceof HTMLElement)) return false;\n  const tag = target.tagName;\n  if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT') return true;\n  return target.isContentEditable;\n}\n\n/**\n * Global keybinding registry.\n *\n * Bindings are keyed off `KeyboardEvent.key` + modifier state. Multiple\n * handlers per chord fire in priority order; a handler that calls\n * `event.preventDefault()` stops lower-priority bindings on that key.\n *\n * The listener runs outside Angular — only matched bindings re-enter\n * the zone, so an idle page doesn't trigger CD on every keystroke.\n *\n * Use `[wrHotkey]` for declarative element-scoped bindings.\n *\n * @example\n * ```ts\n * const hotkeys = inject(WrHotkey);\n * const handle = hotkeys.bind('mod+k', () => openCommandPalette());\n * // ...later\n * handle.unbind();\n * ```\n *\n * @see https://ngwr.dev/services/hotkey\n */\n@Service()\nexport class WrHotkey {\n  private readonly doc = inject(DOCUMENT);\n  private readonly zone = inject(NgZone);\n  private readonly platform = inject(WrPlatform);\n\n  private readonly isMac = (this.platform.userAgent ?? '').toLowerCase().includes('mac');\n\n  /** Bindings grouped by listener target. */\n  private readonly registries = new Map<EventTarget, Set<Binding>>();\n\n  /** Register a binding. */\n  bind(spec: WrHotkeySpec, handler: (event: KeyboardEvent) => void, options: WrHotkeyOptions = {}): WrHotkeyHandle {\n    const parsed = parseHotkeySpec(spec, this.isMac);\n    const resolved: Required<WrHotkeyOptions> = { ...FALLBACK_OPTIONS, ...options };\n    const target: EventTarget = resolved.element ?? this.doc;\n    const binding: Binding = { parsed, handler, options: resolved };\n\n    let bucket = this.registries.get(target);\n    if (!bucket) {\n      bucket = new Set();\n      this.registries.set(target, bucket);\n      this.attach(target);\n    }\n    bucket.add(binding);\n\n    return {\n      unbind: () => {\n        bucket?.delete(binding);\n        if (bucket?.size === 0) {\n          this.registries.delete(target);\n          this.detach(target);\n        }\n      },\n    };\n  }\n\n  // Internals\n\n  private readonly listeners = new Map<EventTarget, EventListener>();\n\n  private attach(target: EventTarget): void {\n    const listener: EventListener = event => this.dispatch(target, event as KeyboardEvent);\n    this.zone.runOutsideAngular(() => target.addEventListener('keydown', listener));\n    this.listeners.set(target, listener);\n  }\n\n  private detach(target: EventTarget): void {\n    const listener = this.listeners.get(target);\n    if (!listener) return;\n    target.removeEventListener('keydown', listener);\n    this.listeners.delete(target);\n  }\n\n  private dispatch(target: EventTarget, event: KeyboardEvent): void {\n    const bucket = this.registries.get(target);\n    if (!bucket || bucket.size === 0) return;\n\n    const matches: Binding[] = [];\n    for (const binding of bucket) {\n      if (!matchesHotkey(event, binding.parsed)) continue;\n      if (!binding.options.allowInInput && isEditableTarget(event.target)) continue;\n      matches.push(binding);\n    }\n    if (matches.length === 0) return;\n\n    matches.sort((a, b) => b.options.priority - a.options.priority);\n\n    this.zone.run(() => {\n      for (const binding of matches) {\n        if (binding.options.preventDefault) event.preventDefault();\n        binding.handler(event);\n        if (event.defaultPrevented) break;\n      }\n    });\n  }\n}\n","/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { DestroyRef, Directive, ElementRef, effect, inject, input, output } from '@angular/core';\n\nimport type { WrHotkeyHandle, WrHotkeySpec } from './interfaces';\nimport { WrHotkey } from './wr-hotkey';\n\n/**\n * Declarative wrapper around {@link WrHotkey}.\n *\n * Binds on init (and re-binds when the spec changes), unbinds on destroy.\n * Defaults to global scope so the binding works regardless of focus —\n * pass `[scoped]=\"true\"` to limit it to the host element.\n *\n * @example\n * ```html\n * <button (wrHotkeyMatch)=\"open()\" [wrHotkey]=\"'mod+k'\">Open palette</button>\n * <div tabindex=\"0\" [wrHotkey]=\"'escape'\" [scoped]=\"true\" (wrHotkeyMatch)=\"close()\">…</div>\n * ```\n */\n@Directive({ selector: '[wrHotkey]' })\nexport class WrHotkeyBinding {\n  readonly wrHotkey = input.required<WrHotkeySpec>();\n\n  /** Scope the binding to the host element instead of `document`. @default false */\n  readonly scoped = input(false, { transform: coerceBooleanProperty });\n\n  /** Fire even when an input / textarea has focus. @default false */\n  readonly allowInInput = input(false, { transform: coerceBooleanProperty });\n\n  /** Suppress the default action when the binding fires. @default true */\n  readonly preventDefault = input(true, { transform: coerceBooleanProperty });\n\n  /** Emits the original KeyboardEvent on match. */\n  readonly wrHotkeyMatch = output<KeyboardEvent>();\n\n  private readonly hotkeys = inject(WrHotkey);\n  private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n  private handle: WrHotkeyHandle | null = null;\n\n  constructor() {\n    effect(() => {\n      this.handle?.unbind();\n      this.handle = this.hotkeys.bind(this.wrHotkey(), event => this.wrHotkeyMatch.emit(event), {\n        element: this.scoped() ? this.host.nativeElement : undefined,\n        allowInInput: this.allowInInput(),\n        preventDefault: this.preventDefault(),\n      });\n    });\n    inject(DestroyRef).onDestroy(() => this.handle?.unbind());\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}