{"mappings":"AAAA,SAAS,gBAAgB,eAAe,cAAc,qBAAqB;UAEjE;CAAY;CAAG;EAAyB;MAC3C,GAAG,MAAM,IAAI;;AAGpB,iBAAiB;CAAS;CAAoB;CAAQ;CAAK;EAAQ;EAChE,GAAG,MAAM,OAAO;EAChB,iBAAiB,eAAe,KAAK;;AAGxC,iBAAiB;CAAe;CAAK;EAAQ;CAC3C,KAAK;CACL,SAAS;EAAE,SAAS;EAAsB,QAAQ;;CAClD;;AAGF,YAAY,gBAAgB,+BAA+B,GAAG,SAAS;AAEvE,YAAY;CAAa;CAAG;IAAK,gBAAgB,wBAAwB,sBAAsB,KAAK;KAE/F,oBACD;CACE,OAAO;CACP;IAEF;CACE,OAAO;CACP,UAAU;KAEX;CACC,OAAO;CACP,UAAU;IACR,WAAW,eAAe,eAAe,OAC5C;CACC,OAAO;CACP,UAAU;IACR,WAAW,cAAc,eAAe;AAMhD,cAAM;AAkBN,OAAO,cAAM,UAAU;CACrB;EAAc,UAAU,cAAc;EAAa;EAAyB;GAC1E,KAAK,IAAI,YAAY,GAAG,OAAO,GAAG,MAAM,MAAM,IAC9C,MAAM,IACL,aAAa,GAAG;CAUnB;EAAO,UAAU,cAAc;EAAa;EAAyB;GACnE,MAAM,IAAI,YAAY,GAAG,OAAO,GAAG,MAAM,MAAM,IAC/C,UAAS,qBAET,SAAS,sBACT,GAAG,QAAQ,gBAAgB,aAAa,GAAG,UACxC,SAAS,GAAG,aAAa,GAAG,WAAW,KAAK,gBAAgB,aAAa,GAAG;CAsCjF,WAAW,SAAS,aAAa,iBAAiB,UAAS;CAY3D,YAAY,SAAS;CAIrB,UAAU;CAIV,WAAW,SAAS,aAAa,oBAAoB,eAAe,gBAAgB,gBAAgB;;AAYtG,OAAO,cAAM,QAAS,WAAW,GAAG,qBAAqB,SAAS,GAAG,GAAG,mBAAiB","names":[],"sources":["../../../src/lib/powerstyl.ts"],"version":3,"sourcesContent":["import { AdoptedManager, GlobalManager, managerTypes, ScopedManager } from \"./manager.ts\";\n\ninterface Constructor<T, A extends any[] = any[]> {\n  new (...args: A): T;\n}\n\nexport interface StyledFn<Args extends any[], Return, Tag, Values> {\n  (...args: Args): Return;\n  [metadataSymbol]: StyledMetadata<Tag, Values>;\n}\n\nexport interface StyledMetadata<Tag, Values> {\n  tag: Tag;\n  extends: { strings: TemplateStringsArray; values: Values }[];\n  isStatic: boolean;\n}\n\nexport type StyledPartValue<T> = string | number | ((this: T, element: T) => string | number);\n\nexport type NamedElement<K, T> = K extends keyof HTMLElementTagNameMap ? HTMLElementTagNameMap[K] : T;\n\ntype ApplyStyleOptions =\n  | {\n      type?: \"inline\";\n      manager?: undefined;\n    }\n  | {\n      type?: \"scoped\";\n      manager?: ScopedManager;\n    }\n  | ({\n      type?: \"adopted\";\n      manager?: AdoptedManager;\n    } & Parameters<AdoptedManager[\"applyStyle\"]>[1])\n  | ({\n      type?: \"global\";\n      manager?: GlobalManager;\n    } & Parameters<GlobalManager[\"applyStyle\"]>[1]);\n\nlet globalManager: GlobalManager;\n\nconst styledMap = new WeakMap<HTMLElement, () => void>();\n\nconst metadataSymbol: unique symbol = Symbol();\n\nconst getMetadata = (tag: any): StyledMetadata<any, any[]> => {\n  const tagMetadata = isFunction(tag) ? tag[metadataSymbol] || {} : {};\n  return {\n    isStatic: tagMetadata.isStatic || false,\n    tag: tagMetadata.tag ?? tag,\n    extends: tagMetadata.extends || [],\n  };\n};\n\nconst isFunction = (value: any): value is Function => typeof value === \"function\";\n\nconst functionIsConstructor = (value: Function): value is Constructor<any> => value.prototype?.constructor === value;\n\nconst joinParts = <T>(strings: TemplateStringsArray, values: T[], fn: (arg0: T) => string): string =>\n  values.length ? strings.reduce((acc, cur, i) => acc + cur + (i < values.length ? fn(values[i]) || \"\" : \"\"), \"\") : strings[0];\n\nexport class Powerstyl {\n  createElement<E extends HTMLElement = HTMLElement, A extends any[] = any[], N extends string = string>(\n    tag: N | Constructor<E, A> | ((...args: A) => E),\n    args: A,\n  ): NamedElement<N, E> {\n    if (isFunction(tag)) {\n      if (functionIsConstructor(tag)) {\n        return new tag(...args) as NamedElement<N, E>;\n      }\n      return tag(...args) as NamedElement<N, E>;\n    }\n    return document.createElement(tag) as NamedElement<N, E>;\n  }\n\n  styled<E extends HTMLElement = HTMLElement, A extends any[] = any[], N extends string = string>(\n    tag?: N | Constructor<E, A> | ((...args: A) => E),\n    options: ApplyStyleOptions = {},\n  ): (\n    strings: TemplateStringsArray,\n    ...values: StyledPartValue<NamedElement<N, E>>[]\n  ) => StyledFn<A, NamedElement<N, E>, typeof tag, StyledPartValue<NamedElement<N, E>>[]> {\n    return (strings, ...values) => {\n      const tagMetadata: StyledMetadata<typeof tag, StyledPartValue<NamedElement<N, E>>[]> = getMetadata(tag);\n      const finalTag = tagMetadata.tag;\n      const finalExtends = [...tagMetadata.extends, { strings, values }];\n      const isStatic = tagMetadata.isStatic && !values.some(isFunction);\n\n      const styledFn: StyledFn<A, NamedElement<N, E>, typeof tag, StyledPartValue<NamedElement<N, E>>[]> = (...args: A) => {\n        const element = this.createElement(finalTag, args);\n        options.type ??= element.shadowRoot ? managerTypes.adopted : managerTypes.scoped;\n        options.manager ??= this.getManager(element, options.type);\n\n        const partValueToString = isStatic\n          ? String\n          : (value: StyledPartValue<NamedElement<N, E>>): string => String(isFunction(value) ? value.call(element, element) : value);\n\n        const templateObjectToString = ({ strings, values }) => joinParts(strings, values, partValueToString);\n\n        const updateStyle = () => {\n          this.applyStyle(element, finalExtends.map(templateObjectToString).join(\"\"), options);\n        };\n        updateStyle();\n\n        if (!isStatic) {\n          styledMap.set(element, updateStyle);\n        }\n        return element;\n      };\n\n      styledFn[metadataSymbol] = {\n        tag: finalTag,\n        extends: finalExtends,\n        isStatic,\n      };\n      return styledFn;\n    };\n  }\n\n  applyStyle(element: HTMLElement, cssText: string, options: ApplyStyleOptions = {}): void {\n    const { manager, type, ...restOptions } = options;\n    if (type === managerTypes.inline) {\n      element.style.cssText = cssText;\n      return;\n    }\n    const { css, applyOptions } = manager.prepare(cssText, element);\n    if (applyOptions) {\n      manager.applyStyle(this.transform(css), { ...applyOptions, ...restOptions });\n    }\n  }\n\n  updateStyle(element: HTMLElement): void {\n    styledMap.get(element)?.();\n  }\n\n  transform(s: string): string {\n    return s;\n  }\n\n  getManager(element: HTMLElement, type?: keyof typeof managerTypes): ScopedManager | GlobalManager | AdoptedManager | undefined {\n    switch (type) {\n      case managerTypes.scoped:\n        return new ScopedManager(element);\n      case managerTypes.global:\n        return (globalManager ??= new GlobalManager(document.head));\n      case managerTypes.adopted:\n        return new AdoptedManager(element);\n    }\n  }\n}\n\nexport const mixin = <T extends (...args: any[]) => any>(styler0: T, ...stylers: any[]): T => {\n  const result: any = (...a) => styler0(...a);\n  const resultMetadata = getMetadata(styler0);\n  for (const arg of stylers) {\n    const argMetadata = getMetadata(arg);\n    resultMetadata.isStatic ||= argMetadata.isStatic;\n    resultMetadata.extends.push(...argMetadata.extends);\n  }\n  result[metadataSymbol] = resultMetadata;\n  return result;\n};\n"],"file":"powerstyl.d.ts"}