{"version":3,"file":"complex.mjs","sources":["../../../../src/utils/mix/complex.ts"],"sourcesContent":["import { pipe, warning } from \"motion-utils\"\nimport { AnyResolvedKeyframe } from \"../../animation/types\"\nimport { isCSSVariableToken } from \"../../animation/utils/is-css-variable\"\nimport { color } from \"../../value/types/color\"\nimport {\n    analyseComplexValue,\n    complex,\n    ComplexValueInfo,\n    ComplexValues,\n} from \"../../value/types/complex\"\nimport { HSLA, RGBA } from \"../../value/types/types\"\nimport { mixColor } from \"./color\"\nimport { mixImmediate } from \"./immediate\"\nimport { mixNumber as mixNumberImmediate } from \"./number\"\nimport { invisibleValues, mixVisibility } from \"./visibility\"\n\ntype MixableArray = Array<number | RGBA | HSLA | string>\ninterface MixableObject {\n    [key: string]: AnyResolvedKeyframe | RGBA | HSLA\n}\n\nfunction mixNumber(a: number, b: number) {\n    return (p: number) => mixNumberImmediate(a, b, p)\n}\n\nexport function getMixer<T>(a: T) {\n    if (typeof a === \"number\") {\n        return mixNumber\n    } else if (typeof a === \"string\") {\n        return isCSSVariableToken(a)\n            ? mixImmediate\n            : color.test(a)\n            ? mixColor\n            : mixComplex\n    } else if (Array.isArray(a)) {\n        return mixArray\n    } else if (typeof a === \"object\") {\n        return color.test(a) ? mixColor : mixObject\n    }\n\n    return mixImmediate\n}\n\nexport function mixArray(a: MixableArray, b: MixableArray) {\n    const output = [...a]\n    const numValues = output.length\n\n    const blendValue = a.map((v, i) => getMixer(v)(v as any, b[i] as any))\n\n    return (p: number) => {\n        for (let i = 0; i < numValues; i++) {\n            output[i] = blendValue[i](p) as any\n        }\n        return output\n    }\n}\n\nexport function mixObject(a: MixableObject, b: MixableObject) {\n    const output = { ...a, ...b }\n    const blendValue: { [key: string]: (v: number) => any } = {}\n\n    for (const key in output) {\n        if (a[key] !== undefined && b[key] !== undefined) {\n            blendValue[key] = getMixer(a[key])(\n                a[key] as any,\n                b[key] as any\n            ) as any\n        }\n    }\n\n    return (v: number) => {\n        for (const key in blendValue) {\n            output[key] = blendValue[key](v)\n        }\n        return output\n    }\n}\n\nfunction matchOrder(\n    origin: ComplexValueInfo,\n    target: ComplexValueInfo\n): ComplexValues {\n    const orderedOrigin: ComplexValues = []\n\n    const pointers = { color: 0, var: 0, number: 0 }\n\n    for (let i = 0; i < target.values.length; i++) {\n        const type = target.types[i]\n        const originIndex = origin.indexes[type][pointers[type]]\n        const originValue = origin.values[originIndex] ?? 0\n\n        orderedOrigin[i] = originValue\n\n        pointers[type]++\n    }\n\n    return orderedOrigin\n}\n\nexport const mixComplex = (\n    origin: AnyResolvedKeyframe,\n    target: AnyResolvedKeyframe\n) => {\n    const template = complex.createTransformer(target)\n    const originStats = analyseComplexValue(origin)\n    const targetStats = analyseComplexValue(target)\n    const canInterpolate =\n        originStats.indexes.var.length === targetStats.indexes.var.length &&\n        originStats.indexes.color.length === targetStats.indexes.color.length &&\n        originStats.indexes.number.length >= targetStats.indexes.number.length\n\n    if (canInterpolate) {\n        if (\n            (invisibleValues.has(origin as string) &&\n                !targetStats.values.length) ||\n            (invisibleValues.has(target as string) &&\n                !originStats.values.length)\n        ) {\n            return mixVisibility(origin as string, target as string)\n        }\n\n        return pipe(\n            mixArray(matchOrder(originStats, targetStats), targetStats.values),\n            template\n        )\n    } else {\n        warning(\n            true,\n            `Complex values '${origin}' and '${target}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`,\n            \"complex-values-different\"\n        )\n\n        return mixImmediate(origin, target)\n    }\n}\n"],"names":["mixNumberImmediate"],"mappings":";;;;;;;;;AAqBA,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS,EAAA;AACnC,IAAA,OAAO,CAAC,CAAS,KAAKA,WAAkB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACrD;AAEM,SAAU,QAAQ,CAAI,CAAI,EAAA;AAC5B,IAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AACvB,QAAA,OAAO,SAAS;IACpB;AAAO,SAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;QAC9B,OAAO,kBAAkB,CAAC,CAAC;AACvB,cAAE;AACF,cAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AACd,kBAAE;kBACA,UAAU;IACpB;AAAO,SAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACzB,QAAA,OAAO,QAAQ;IACnB;AAAO,SAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;AAC9B,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,SAAS;IAC/C;AAEA,IAAA,OAAO,YAAY;AACvB;AAEM,SAAU,QAAQ,CAAC,CAAe,EAAE,CAAe,EAAA;AACrD,IAAA,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC;AACrB,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM;IAE/B,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAQ,EAAE,CAAC,CAAC,CAAC,CAAQ,CAAC,CAAC;IAEtE,OAAO,CAAC,CAAS,KAAI;AACjB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE;YAChC,MAAM,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAQ;QACvC;AACA,QAAA,OAAO,MAAM;AACjB,IAAA,CAAC;AACL;AAEM,SAAU,SAAS,CAAC,CAAgB,EAAE,CAAgB,EAAA;IACxD,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE;IAC7B,MAAM,UAAU,GAA0C,EAAE;AAE5D,IAAA,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;AACtB,QAAA,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE;YAC9C,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAC9B,CAAC,CAAC,GAAG,CAAQ,EACb,CAAC,CAAC,GAAG,CAAQ,CACT;QACZ;IACJ;IAEA,OAAO,CAAC,CAAS,KAAI;AACjB,QAAA,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE;YAC1B,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpC;AACA,QAAA,OAAO,MAAM;AACjB,IAAA,CAAC;AACL;AAEA,SAAS,UAAU,CACf,MAAwB,EACxB,MAAwB,EAAA;IAExB,MAAM,aAAa,GAAkB,EAAE;AAEvC,IAAA,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;AAEhD,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5B,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;AAEnD,QAAA,aAAa,CAAC,CAAC,CAAC,GAAG,WAAW;AAE9B,QAAA,QAAQ,CAAC,IAAI,CAAC,EAAE;IACpB;AAEA,IAAA,OAAO,aAAa;AACxB;MAEa,UAAU,GAAG,CACtB,MAA2B,EAC3B,MAA2B,KAC3B;IACA,MAAM,QAAQ,GAAG,OAAO,CAAC,iBAAiB,CAAC,MAAM,CAAC;AAClD,IAAA,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC;AAC/C,IAAA,MAAM,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAAC;AAC/C,IAAA,MAAM,cAAc,GAChB,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM;AACjE,QAAA,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;AACrE,QAAA,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM;IAE1E,IAAI,cAAc,EAAE;AAChB,QAAA,IACI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAgB,CAAC;AAClC,YAAA,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM;AAC9B,aAAC,eAAe,CAAC,GAAG,CAAC,MAAgB,CAAC;AAClC,gBAAA,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EACjC;AACE,YAAA,OAAO,aAAa,CAAC,MAAgB,EAAE,MAAgB,CAAC;QAC5D;AAEA,QAAA,OAAO,IAAI,CACP,QAAQ,CAAC,UAAU,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EAClE,QAAQ,CACX;IACL;SAAO;QACH,OAAO,CACH,IAAI,EACJ,CAAA,gBAAA,EAAmB,MAAM,CAAA,OAAA,EAAU,MAAM,CAAA,wKAAA,CAA0K,EACnN,0BAA0B,CAC7B;AAED,QAAA,OAAO,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC;IACvC;AACJ;;;;"}