{"version":3,"file":"create-dom-effect.mjs","sources":["../../../../src/effects/utils/create-dom-effect.ts"],"sourcesContent":["import {\n    ElementOrSelector,\n    resolveElements,\n} from \"../../utils/resolve-elements\"\nimport { MotionValue } from \"../../value\"\nimport { MotionValueState } from \"../MotionValueState\"\nimport {\n    AnimateEffect,\n    Effect,\n    EffectOptions,\n    EffectRead,\n    EffectTest,\n} from \"./create-effect\"\n\n/**\n * The element overloads come last so generic inference sees the subject type.\n */\nexport interface SelectorEffect<T extends object> extends EffectOptions<T> {\n    (\n        subject: ElementOrSelector,\n        values: Record<string, MotionValue>\n    ): VoidFunction\n    (subject: T, values: Record<string, MotionValue>): VoidFunction\n\n    get(subject: ElementOrSelector, key: string): MotionValue | undefined\n    get(subject: T, key: string): MotionValue | undefined\n\n    flush(subject: T): void\n    state(subject: T): MotionValueState | undefined\n}\n\nexport interface SelectorAnimateEffect<T extends object>\n    extends SelectorEffect<T> {\n    test: EffectTest<T>\n    read: EffectRead<T>\n}\n\n/**\n * Wraps a per-element effect so it also accepts selectors and element\n * lists. `test`, `read` and `get` still address a single element, so the\n * result can be registered with `animate.addEffect()`.\n */\nexport function createSelectorEffect<T extends object>(\n    subjectEffect: AnimateEffect<T>\n): SelectorAnimateEffect<T>\nexport function createSelectorEffect<T extends object>(\n    subjectEffect: Effect<T>\n): SelectorEffect<T>\nexport function createSelectorEffect<T extends object>(\n    subjectEffect: Effect<T>\n): SelectorEffect<T> {\n    const effect = (\n        subject: T | ElementOrSelector,\n        values: Record<string, MotionValue>\n    ) => {\n        const elements = resolveElements(subject as ElementOrSelector)\n        const subscriptions: VoidFunction[] = []\n\n        for (const element of elements) {\n            const remove = subjectEffect(element as T, values)\n            subscriptions.push(remove)\n        }\n\n        return () => {\n            for (const remove of subscriptions) remove()\n        }\n    }\n\n    const { test, read, get, flush, state } = subjectEffect\n\n    return Object.assign(effect, {\n        test,\n        read,\n        get: get as SelectorEffect<T>[\"get\"],\n        flush,\n        state,\n    })\n}\n"],"names":[],"mappings":";;AAgDM,SAAU,oBAAoB,CAChC,aAAwB,EAAA;AAExB,IAAA,MAAM,MAAM,GAAG,CACX,OAA8B,EAC9B,MAAmC,KACnC;AACA,QAAA,MAAM,QAAQ,GAAG,eAAe,CAAC,OAA4B,CAAC;QAC9D,MAAM,aAAa,GAAmB,EAAE;AAExC,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,OAAY,EAAE,MAAM,CAAC;AAClD,YAAA,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;QAC9B;AAEA,QAAA,OAAO,MAAK;YACR,KAAK,MAAM,MAAM,IAAI,aAAa;AAAE,gBAAA,MAAM,EAAE;AAChD,QAAA,CAAC;AACL,IAAA,CAAC;AAED,IAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,aAAa;AAEvD,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QACzB,IAAI;QACJ,IAAI;AACJ,QAAA,GAAG,EAAE,GAA+B;QACpC,KAAK;QACL,KAAK;AACR,KAAA,CAAC;AACN;;;;"}