{
  "version": 3,
  "sources": ["../../src/modules/event/hooks/useCustomEvent.ts", "../../src/modules/event/hooks/useEvent.ts"],
  "sourcesContent": ["import { assertEx } from '@ariestools/sdk'\nimport type { RefObject } from 'react'\nimport { useEffect, useRef } from 'react'\n\n/** Listener callback for a custom DOM event detail payload. */\nexport type CustomEventListener<T = unknown> = (detail: T, event?: Event) => boolean | void\n\n/** Hook that binds a custom DOM event listener and returns a dispatch function. */\nexport const useCustomEvent = <TElement extends HTMLElement, TDetail = unknown>(\n  type: string,\n  listener?: CustomEventListener<TDetail>,\n  customRef?: RefObject<TElement | null>,\n): [RefObject<TElement | null>, CustomEventListener<TDetail>] => {\n  const newRef = useRef<TElement>(null)\n  const ref = customRef ?? newRef\n  useEffect(() => {\n    const element = ref?.current\n    const currentListener = listener\n    const handler\n      = currentListener\n        ? (event: Event) => {\n            const customEvent = event as CustomEvent<TDetail>\n            const detail = assertEx(customEvent.detail, () => 'Event missing detail')\n            const stop = currentListener(detail)\n            if (stop) {\n              event.stopPropagation()\n            }\n          }\n        : undefined\n\n    if (handler && element) {\n      element?.addEventListener(type, handler)\n    }\n    return () => {\n      if (handler && element) {\n        element?.removeEventListener(type, handler)\n      }\n    }\n  })\n  const dispatch: CustomEventListener<TDetail> = (detail?: TDetail, sourceEvent?: Event) => {\n    const event = new CustomEvent<TDetail>(type, {\n      bubbles: true,\n      cancelable: true,\n      composed: true,\n      detail: {\n        ...detail,\n        sourceEvent,\n      } as TDetail,\n    })\n    ref.current?.dispatchEvent(event)\n  }\n  return [ref, dispatch]\n}\n", "import type { RefObject } from 'react'\n\nimport { useCustomEvent } from './useCustomEvent.ts'\n\n/** Domain object noun for XYO UI events (payload, address, schema, etc.). */\nexport type EventNoun = 'payload' | 'boundwitness' | 'address' | 'hash' | 'signature' | 'schema'\n/** Extends {@link EventNoun} with additional string nouns when provided. */\nexport type ExtendEventNoun<Extension extends string | void = void> = Extension extends string ? Extension : EventNoun\n\n/** Verb describing the user interaction for an XYO UI event. */\nexport type EventVerb = 'click' | 'favorite'\n\n/** Optional data attached to a dispatched XYO UI event. */\nexport interface EventData { sourceEvent?: globalThis.Event }\n\n/** Structured XYO UI event with noun, verb, and optional data. */\nexport interface Event<TNoun = ExtendEventNoun, TVerb = EventVerb, TData = string> {\n  data?: TData\n  noun: TNoun\n  sourceEvent?: globalThis.Event\n  verb: TVerb\n}\n\n/** Function signature for dispatching structured XYO UI events. */\nexport type EventDispatch<TNoun = ExtendEventNoun, TVerb = EventVerb, TData = string> = (\n  noun: TNoun,\n  verb: TVerb,\n  data?: TData,\n  sourceEvent?: globalThis.Event,\n) => boolean | void\n\n/** Hook that listens for and dispatches structured XYO UI events on an element. */\nexport const useEvent = <T extends HTMLElement, TNoun = ExtendEventNoun, TVerb = EventVerb, TData = string>(\n  listener?: EventDispatch<TNoun, TVerb, TData>,\n  sharableRef?: RefObject<T | null>,\n): [RefObject<T | null>, EventDispatch<TNoun, TVerb, TData>] => {\n  const [ref, customDispatch] = useCustomEvent<T, Event<TNoun, TVerb, TData>>(\n    'xyo',\n    listener\n      ? (detail: Event<TNoun, TVerb, TData>) => {\n          return listener(detail.noun, detail.verb, detail.data, detail.sourceEvent)\n        }\n      : undefined,\n    sharableRef,\n  )\n\n  const dispatch: EventDispatch<TNoun, TVerb, TData> = (noun: TNoun, verb: TVerb, data?: TData, sourceEvent?: globalThis.Event) => {\n    return customDispatch({\n      data, noun, verb,\n    }, sourceEvent)\n  }\n  return [ref, dispatch]\n}\n"],
  "mappings": ";AAAA,SAAS,gBAAgB;AAEzB,SAAS,WAAW,cAAc;AAM3B,IAAM,iBAAiB,CAC5B,MACA,UACA,cAC+D;AAC/D,QAAM,SAAS,OAAiB,IAAI;AACpC,QAAM,MAAM,aAAa;AACzB,YAAU,MAAM;AACd,UAAM,UAAU,KAAK;AACrB,UAAM,kBAAkB;AACxB,UAAM,UACF,kBACE,CAAC,UAAiB;AAChB,YAAM,cAAc;AACpB,YAAM,SAAS,SAAS,YAAY,QAAQ,MAAM,sBAAsB;AACxE,YAAM,OAAO,gBAAgB,MAAM;AACnC,UAAI,MAAM;AACR,cAAM,gBAAgB;AAAA,MACxB;AAAA,IACF,IACA;AAEN,QAAI,WAAW,SAAS;AACtB,eAAS,iBAAiB,MAAM,OAAO;AAAA,IACzC;AACA,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,iBAAS,oBAAoB,MAAM,OAAO;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,WAAyC,CAAC,QAAkB,gBAAwB;AACxF,UAAM,QAAQ,IAAI,YAAqB,MAAM;AAAA,MAC3C,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,QAAQ;AAAA,QACN,GAAG;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AACD,QAAI,SAAS,cAAc,KAAK;AAAA,EAClC;AACA,SAAO,CAAC,KAAK,QAAQ;AACvB;;;ACpBO,IAAM,WAAW,CACtB,UACA,gBAC8D;AAC9D,QAAM,CAAC,KAAK,cAAc,IAAI;AAAA,IAC5B;AAAA,IACA,WACI,CAAC,WAAuC;AACtC,aAAO,SAAS,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,WAAW;AAAA,IAC3E,IACA;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,WAA+C,CAAC,MAAa,MAAa,MAAc,gBAAmC;AAC/H,WAAO,eAAe;AAAA,MACpB;AAAA,MAAM;AAAA,MAAM;AAAA,IACd,GAAG,WAAW;AAAA,EAChB;AACA,SAAO,CAAC,KAAK,QAAQ;AACvB;",
  "names": []
}
