{"version":3,"sources":["../../../../src/sensors/useOnStartTyping/core.ts"],"sourcesContent":["import { defaultDocument } from \"@shared/configurable\";\nimport { createEventListener } from \"../../browser/useEventListener/core\";\n\n// ---------------------------------------------------------------------------\n// Helpers — pure functions, no React or Legend-State dependencies\n// ---------------------------------------------------------------------------\n\nconst editableTypes = new Set([\n  \"text\",\n  \"password\",\n  \"email\",\n  \"number\",\n  \"search\",\n  \"tel\",\n  \"url\",\n  \"date\",\n  \"datetime-local\",\n  \"month\",\n  \"time\",\n  \"week\",\n]);\n\nfunction isFocusedElementEditable(doc: Document): boolean {\n  const el = doc.activeElement;\n  if (!el) return false;\n\n  if (el instanceof HTMLInputElement) {\n    return editableTypes.has(el.type);\n  }\n\n  if (el instanceof HTMLTextAreaElement) return true;\n\n  return (\n    (el as HTMLElement).isContentEditable === true || (el as HTMLElement).contentEditable === \"true\"\n  );\n}\n\nfunction isTypedCharValid(event: KeyboardEvent): boolean {\n  if (event.metaKey || event.ctrlKey || event.altKey) return false;\n  if (event.key.length === 1) return true;\n  return false;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Callback fired when the user starts typing on a non-editable element. */\nexport type OnStartTypingCallback = (event: KeyboardEvent) => void;\n\n// ---------------------------------------------------------------------------\n// Core (framework-agnostic)\n// ---------------------------------------------------------------------------\n\n/**\n * Framework-agnostic \"start typing\" detector.\n *\n * Registers a `keydown` listener on `document` and fires `onStart` when the\n * user presses a typeable key while no editable element (input, textarea,\n * contenteditable) is focused.\n *\n * Must be called inside a `useScope` factory so that `createEventListener`\n * and cleanup are bound to the correct scope.\n */\nexport function createOnStartTyping(onStart: OnStartTypingCallback): void {\n  const listener = (event: KeyboardEvent) => {\n    const doc = (event.currentTarget as Document) ?? defaultDocument;\n    if (doc && !isFocusedElementEditable(doc) && isTypedCharValid(event)) {\n      onStart(event);\n    }\n  };\n\n  createEventListener(defaultDocument, \"keydown\", listener, { passive: true });\n}\n"],"mappings":"AAAA,SAAS,uBAAuB;AAChC,SAAS,2BAA2B;AAMpC,MAAM,gBAAgB,oBAAI,IAAI;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,yBAAyB,KAAwB;AACxD,QAAM,KAAK,IAAI;AACf,MAAI,CAAC,GAAI,QAAO;AAEhB,MAAI,cAAc,kBAAkB;AAClC,WAAO,cAAc,IAAI,GAAG,IAAI;AAAA,EAClC;AAEA,MAAI,cAAc,oBAAqB,QAAO;AAE9C,SACG,GAAmB,sBAAsB,QAAS,GAAmB,oBAAoB;AAE9F;AAEA,SAAS,iBAAiB,OAA+B;AACvD,MAAI,MAAM,WAAW,MAAM,WAAW,MAAM,OAAQ,QAAO;AAC3D,MAAI,MAAM,IAAI,WAAW,EAAG,QAAO;AACnC,SAAO;AACT;AAuBO,SAAS,oBAAoB,SAAsC;AACxE,QAAM,WAAW,CAAC,UAAyB;AACzC,UAAM,MAAO,MAAM,iBAA8B;AACjD,QAAI,OAAO,CAAC,yBAAyB,GAAG,KAAK,iBAAiB,KAAK,GAAG;AACpE,cAAQ,KAAK;AAAA,IACf;AAAA,EACF;AAEA,sBAAoB,iBAAiB,WAAW,UAAU,EAAE,SAAS,KAAK,CAAC;AAC7E;","names":[]}