{"version":3,"file":"event.cjs","sources":["../packages/event/listen/interface.js","../packages/event/event.js","../packages/event/listen/listen.js","../packages/event/detail/detail.js","../packages/event/formData/formData.js","../packages/event/prevent/prevent.js","../packages/event/stop/stop.js","../packages/event/value/value.js"],"sourcesContent":["export const controller = Symbol(\"controller\");\n","import listen from \"./listen\";\n\n/**\n * Decorator that adds an event listener to an element within the Shadow DOM.\n *\n * @param {string} type - Event type (e.g., 'click').\n * @param {string} selector - CSS selector to identify the event target.\n * @param {...Function} filters - Functions applied to the event before executing the method.\n * @returns {Function} A decorator that associates the method with the event.\n *\n * @description\n * The `event` decorator allows listening to DOM events fired in elements\n * of the Custom Element's Shadow DOM. It allows applying filters to the event\n * before calling the decorated method, and performs automatic management\n * with `AbortController` for listener removal in `disconnectedCallback`.\n *\n * @example\n * class MyElement extends HTMLElement {\n *   @event.click('button')\n *   handleClick(event) {\n *     console.log('Button clicked', event);\n *   }\n * }\n */\nconst event = new Proxy(\n  {},\n  {\n    get(_, type) {\n      return (selector, ...filters) =>\n        (target, method) => {\n          listen(type)\n            .on(selector)\n            .with(...filters)\n            .in(target)\n            .call(method);\n        };\n    },\n  },\n);\n\nexport default event;\n","import { controller } from \"./interface\";\n\n/**\n * Registra um listener para eventos delegados no Shadow DOM de um Custom Element.\n *\n * @param {string} type - Tipo do evento a ser escutado (ex: 'click', 'input').\n * @returns {{ on: (selector: string) => { with: (...filters: Function[]) => { in: (target: Object) => { call: (method: string|symbol) => void } } } }}\n *\n * @description\n * A função `listen` permite registrar ouvintes de eventos delegados no `shadowRoot`\n * de um Custom Element, de forma fluente e segura. É ideal para escutar eventos em\n * elementos internos sem necessidade de binds manuais ou remoções explícitas.\n *\n * Internamente, a função conecta-se ao `connectedCallback` para registrar o listener,\n * e ao `disconnectedCallback` para removê-lo automaticamente, utilizando `AbortController`.\n *\n * O evento pode ser filtrado por um seletor CSS (`on`) e transformado por uma cadeia de filtros (`with`).\n * O método (`call`) será invocado com o resultado final do filtro aplicado ao evento original.\n *\n * @example\n * listen('click')\n *   .on('button')\n *   .with(e => e) // filtros opcionais\n *   .in(MyElement.prototype)\n *   .call('handleClick');\n */\nconst listen = (type) => ({\n  /**\n   * Define o seletor CSS do elemento alvo dentro do Shadow DOM.\n   *\n   * @param {string} selector - Seletor do elemento a ser escutado.\n   * @returns {{ with: (...filters: Function[]) => { in: (target: Object) => { call: (method: string|symbol) => void } } }}\n   */\n  on: (selector) => ({\n    /**\n     * Define os filtros a serem aplicados ao evento capturado.\n     *\n     * @param {...Function} filters - Funções que recebem o evento e retornam uma transformação.\n     * @returns {{ in: (target: Object) => { call: (method: string|symbol) => void } }}\n     */\n    with: (...filters) => ({\n      /**\n       * Define o protótipo do Custom Element onde os callbacks serão interceptados.\n       *\n       * @param {Object} target - O alvo que terá o connected/disconnected interceptado.\n       * @returns {{ call: (method: string|symbol) => void }}\n       */\n      in: (target) => ({\n        /**\n         * Define o método a ser chamado com o resultado dos filtros aplicados ao evento.\n         *\n         * @param {string|symbol} method - Nome do método que será chamado.\n         * @returns {void}\n         */\n        call: (method) => {\n          target.connectedCallback = new Proxy(\n            target.connectedCallback ?? (() => {}),\n            {\n              apply(original, context, args) {\n                context[controller] = new AbortController();\n\n                const options = { signal: context[controller].signal };\n                const listener = (event) => {\n                  if (event.target.matches(selector)) {\n                    context[method](\n                      filters.reduce((target, filter) => filter(target), event),\n                    );\n                  }\n                };\n\n                context.shadowRoot?.addEventListener(type, listener, options);\n\n                return original.apply(context, args);\n              },\n            },\n          );\n\n          target.disconnectedCallback = new Proxy(\n            target.disconnectedCallback ?? (() => {}),\n            {\n              apply(original, context, args) {\n                context[controller].abort();\n                return original.apply(context, args);\n              },\n            },\n          );\n        },\n      }),\n    }),\n  }),\n});\n\nexport default listen;\n","/**\n * Extracts the detail payload from a CustomEvent.\n *\n * This spark returns `event.detail`, which contains custom data\n * passed when dispatching custom events.\n *\n * @param {CustomEvent} event - The custom event containing detail data.\n * @returns {any} The detail payload from `event.detail`.\n *\n * @example\n * class MyElement extends HTMLElement {\n *   @event('user-selected', detail)\n *   handleUserSelected(userData) {\n *     // Receives the detail payload directly, not the event\n *     console.log('User data:', userData);\n *   }\n * }\n */\nfunction detail(event) {\n  return event.detail;\n}\n\nexport default detail;\n","/**\n * Converts form data to a plain JavaScript object.\n *\n * This spark creates a FormData instance from the event's target form\n * and converts it to a plain object using `Object.fromEntries()`.\n * Includes the submitter element if present.\n *\n * @param {Event} event - The form submission event.\n * @returns {Object.<string, FormDataEntryValue>} An object representation of the form data.\n *\n * @example\n * class MyForm extends HTMLElement {\n *   @event.submit('form', prevent, formData)\n *   handleSubmit(data) {\n *     // Receives form data as a plain object\n *     console.log('Form data:', data);\n *     // { username: 'john', email: 'john@example.com' }\n *   }\n * }\n */\nconst formData = (event) =>\n  Object.fromEntries(new FormData(event.target, event.submitter));\n\nexport default formData;\n","/**\n * Prevents the default action of an event by calling `event.preventDefault()`.\n *\n * This spark cancels the event's default behavior (e.g., form submission,\n * link navigation, checkbox toggling).\n *\n * @param {Event} event - The event to prevent default action for.\n * @returns {Event} The same event for chaining.\n *\n * @example\n * class MyForm extends HTMLElement {\n *   @event.submit('form', prevent)\n *   handleSubmit(event) {\n *     // Form won't submit normally, handle it with JavaScript\n *     console.log('Custom form handling');\n *   }\n * }\n */\nfunction prevent(event) {\n  event.preventDefault();\n  return event;\n}\n\nexport default prevent;\n","/**\n * Stops event propagation by calling `event.stopPropagation()`.\n *\n * This spark prevents the event from bubbling up the DOM tree,\n * stopping any parent handlers from being notified of the event.\n *\n * @param {Event} event - The event to stop propagation for.\n * @returns {Event} The same event for chaining.\n *\n * @example\n * class MyElement extends HTMLElement {\n *   @event.click('button', stop)\n *   handleClick(event) {\n *     // Event won't bubble to parent elements\n *     console.log('Button clicked');\n *   }\n * }\n */\nfunction stop(event) {\n  event.stopPropagation();\n  return event;\n}\n\nexport default stop;\n","/**\n * Extracts the value from an event's target element.\n *\n * This spark returns `event.target.value`, commonly used with\n * input, textarea, and select elements.\n *\n * @param {Event} event - The event containing the target with a value property.\n * @returns {any} The value from `event.target.value`.\n *\n * @example\n * class MyInput extends HTMLElement {\n *   @event.input('input', value)\n *   handleInput(inputValue) {\n *     // Receives the input value directly, not the event\n *     console.log('Input value:', inputValue);\n *   }\n * }\n */\nfunction value(event) {\n  return event.target.value;\n}\n\nexport default value;\n"],"names":["controller","Symbol","event","Proxy","get","_","type","selector","filters","target","method","on","with","in","call","connectedCallback","original","context","args","AbortController","options","signal","shadowRoot","addEventListener","matches","reduce","filter","apply","disconnectedCallback","abort","detail","Object","fromEntries","FormData","submitter","preventDefault","stopPropagation","value"],"mappings":";;AAAO,MAAMA,IAAaC,OAAO,YAAA,GCwB3BC,IAAQ,IAAIC,MAChB,CAAA,GACA,EACEC,KAAG,CAACC,IAAGC,MACE,CAACC,OAAaC,MACnB,CAACC,GAAQC,MAAAA;ACHF,GAACJ,kBAAAA,QAAI,EAOlBK,IAAKJ,CAAAA,QAAQ,EAOXK,MAAM,IAAIJ,QAAO,EAOfK,IAAKJ,CAAAA,QAAM,EAOTK,MAAOJ,CAAAA,OAAAA;AACLD,IAAAA,GAAOM,oBAAoB,IAAIZ,MAC7BM,GAAOM;IAA8B,IACrC,EACE,MAAMC,IAAUC,GAASC,GAAAA;AACvBD,QAAQjB,KAAc,IAAImB;AAE1B,YAAMC,IAAU,EAAEC,QAAQJ,EAAQjB,GAAYqB,OAAAA;AAW9C,aAFAJ,EAAQK,YAAYC,iBAAiBjB,IARnBJ,CAAAA,OAAAA;AACZA,QAAAA,GAAMO,OAAOe,QAAQjB,EAAAA,KACvBU,EAAQP,EAAAA,EACNF,GAAQiB,OAAO,CAAChB,IAAQiB,OAAWA,GAAOjB,KAASP,EAAAA,CAAAA;AAAAA,MAEvD,GAGmDkB,IAE9CJ,GAASW,MAAMV,GAASC,CAAAA;AAAAA,IACjC,EAAA,CAAA,GAIJT,GAAOmB,uBAAuB,IAAIzB,MAChCM,GAAOmB;IAAiC,IACxC,EACED,OAAK,CAACX,IAAUC,IAASC,QACvBD,GAAQjB,CAAAA,EAAY6B,MAAAA,GACbb,GAASW,MAAMV,IAASC;EAGpC,EAAA,GAAA,GAAA,GAAA,IDvDMZ,IACJK,GAAGJ,EAAAA,EACHK,QAAQJ,CAAAA,EACRK,GAAGJ,GACHK,KAAKJ,CAAAA;AAAO;sCEhBzB,SAAgBR,IAAAA;AACd,SAAOA,GAAM4B;AACf,sBCAkB5B,CAAAA,OAChB6B,OAAOC,YAAY,IAAIC,SAAS/B,GAAMO,QAAQP,GAAMgC,SAAAA,CAAAA,qBCHtD,SAAiBhC;AAEf,SADAA,GAAMiC,kBACCjC;AACT,kBCHA,SAAcA;AAEZ,SADAA,GAAMkC,mBACClC;AACT,mBCHA,SAAeA;AACb,SAAOA,GAAMO,OAAO4B;AACtB;"}