{"version":3,"sources":["../../../../src/sensors/useKeyModifier/core.ts"],"sourcesContent":["import { observable, type Observable } from \"@legendapp/state\";\nimport type { ReadonlyObservable } from \"@usels/core\";\nimport { resolveWindowSource, type ConfigurableWindow } from \"@shared/configurable\";\nimport { createEventListener } from \"../../browser/useEventListener/core\";\n\nexport type KeyModifier =\n  | \"Alt\"\n  | \"AltGraph\"\n  | \"CapsLock\"\n  | \"Control\"\n  | \"Fn\"\n  | \"FnLock\"\n  | \"Meta\"\n  | \"NumLock\"\n  | \"ScrollLock\"\n  | \"Shift\"\n  | \"Symbol\"\n  | \"SymbolLock\";\n\nconst DEFAULT_EVENTS = [\"mousedown\", \"mouseup\", \"keydown\", \"keyup\"] as const;\n\nexport interface UseKeyModifierOptions<\n  Initial extends boolean | null = null,\n> extends ConfigurableWindow {\n  /** Events to listen for modifier state changes */\n  events?: string[];\n  /** Initial value before any event fires */\n  initial?: Initial;\n}\n\nexport type UseKeyModifierReturn<Initial extends boolean | null = null> = ReadonlyObservable<\n  Initial extends boolean ? boolean : boolean | null\n>;\n\n/**\n * Framework-agnostic reactive tracker for keyboard modifier key state.\n *\n * Uses `event.getModifierState()` to detect whether a modifier key\n * (Shift, Control, Alt, CapsLock, etc.) is currently active.\n */\n/*@__NO_SIDE_EFFECTS__*/\nexport function createKeyModifier<Initial extends boolean | null = null>(\n  modifier: KeyModifier,\n  options: UseKeyModifierOptions<Initial> = {} as UseKeyModifierOptions<Initial>\n): UseKeyModifierReturn<Initial> {\n  const { events = DEFAULT_EVENTS as unknown as string[], initial = null as Initial } = options;\n\n  const state$ = observable<boolean | null>(initial);\n\n  const win$ = resolveWindowSource(observable(options.window) as unknown as Observable<unknown>);\n\n  const handler = (evt: Event) => {\n    if (typeof (evt as KeyboardEvent).getModifierState === \"function\") {\n      state$.set((evt as KeyboardEvent).getModifierState(modifier));\n    }\n  };\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  createEventListener(win$, events as any, handler, { passive: true });\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  return state$ as any;\n}\n"],"mappings":"AAAA,SAAS,kBAAmC;AAE5C,SAAS,2BAAoD;AAC7D,SAAS,2BAA2B;AAgBpC,MAAM,iBAAiB,CAAC,aAAa,WAAW,WAAW,OAAO;AAAA;AAsB3D,SAAS,kBACd,UACA,UAA0C,CAAC,GACZ;AAC/B,QAAM,EAAE,SAAS,gBAAuC,UAAU,KAAgB,IAAI;AAEtF,QAAM,SAAS,WAA2B,OAAO;AAEjD,QAAM,OAAO,oBAAoB,WAAW,QAAQ,MAAM,CAAmC;AAE7F,QAAM,UAAU,CAAC,QAAe;AAC9B,QAAI,OAAQ,IAAsB,qBAAqB,YAAY;AACjE,aAAO,IAAK,IAAsB,iBAAiB,QAAQ,CAAC;AAAA,IAC9D;AAAA,EACF;AAGA,sBAAoB,MAAM,QAAe,SAAS,EAAE,SAAS,KAAK,CAAC;AAGnE,SAAO;AACT;","names":[]}