{"version":3,"sources":["../../src/use-style-tag/index.ts"],"sourcesContent":["import { useEffect, useRef } from 'react'\nimport { useCreation } from '../use-creation'\nimport { useEffectOnce } from '../use-effect-once'\nimport { useLatest } from '../use-latest'\nimport { useSafeState } from '../use-safe-state'\nimport { useStableFn } from '../use-stable-fn'\nimport { useUpdateEffect } from '../use-update-effect'\nimport { isClient } from '../utils/basic'\n\nimport type { MutableRefObject } from 'react'\n\nexport interface UseStyleTagReturns {\n  /**\n   * Unique identifier of the style tag\n   */\n  id: string\n  /**\n   * CSS content\n   */\n  css: string\n  /**\n   * Set CSS content\n   */\n  setCss: (newCss: string) => void\n  /**\n   * Reset CSS content to initial value\n   */\n  resetCss(): void\n  /**\n   * Load the style tag\n   */\n  load(): void\n  /**\n   * Unload the style tag\n   */\n  unload(): void\n  /**\n   * A ref that holds the style tag element\n   */\n  styleTag: MutableRefObject<HTMLStyleElement | null>\n  /**\n   * A ref that holds the loading state of the style tag\n   */\n  isLoaded: MutableRefObject<boolean>\n}\n\nexport interface UseStyleTagOptions {\n  /**\n   * Media query for styles to apply\n   */\n  media?: string\n  /**\n   * Whether to load the style tag immediately\n   *\n   * @defaultValue true\n   */\n  immediate?: boolean\n  /**\n   * Whether to manually control the tag, if not, it will automatically unload\n   *\n   * @defaultValue false\n   */\n  manual?: boolean\n  /**\n   * Unique identifier of the style tag\n   *\n   * @defaultValue auto-incremented\n   */\n  id?: string\n}\n\nconst globalState = /* #__PURE__ */ { id: 0 }\n\n/**\n * A React Hook that helps to apply a style tag to the document with ease in React.\n */\nexport function useStyleTag(initialCss = '', options: UseStyleTagOptions = {}): UseStyleTagReturns {\n  const isLoaded = useRef(false)\n  const styleTag = useRef<HTMLStyleElement | null>(null)\n\n  // rewrite via `React.useId` in next major version\n  const defaultId = useCreation(() => {\n    const id = (++globalState.id).toString().padStart(3, '0')\n    return `use-style-tag__id-${id}`\n  })\n\n  const latestOptions = useLatest(options)\n  const [css, setCss] = useSafeState(initialCss)\n\n  const load = useStableFn(() => {\n    if (!isClient) return\n    const { id = defaultId, media } = latestOptions.current\n    styleTag.current = (document.getElementById(id) || document.createElement('style')) as HTMLStyleElement\n    if (!styleTag.current.isConnected) {\n      styleTag.current.id = id\n      if (media) styleTag.current.media = media\n      document.head.appendChild(styleTag.current)\n    }\n    styleTag.current.textContent = css\n    isLoaded.current = true\n  })\n\n  const unload = useStableFn(() => {\n    if (!document || !isLoaded.current) return\n    const id = latestOptions.current.id || defaultId\n    document.head.removeChild(document.getElementById(id) as HTMLStyleElement)\n    isLoaded.current = false\n  })\n\n  const resetCss = useStableFn(() => setCss(initialCss))\n\n  useEffect(() => {\n    if (!styleTag.current || !isLoaded.current) return\n    styleTag.current.textContent = css\n  }, [css])\n\n  useUpdateEffect(() => void (initialCss && setCss(initialCss)), [initialCss])\n\n  useEffectOnce(() => {\n    const { immediate = true, manual = false } = latestOptions.current\n    immediate && !manual && load()\n\n    return () => {\n      const { manual = false } = latestOptions.current\n      !manual && unload()\n    }\n  })\n\n  return {\n    id: latestOptions.current.id || defaultId,\n    css,\n    setCss,\n    resetCss,\n    load,\n    unload,\n    styleTag: styleTag,\n    isLoaded: isLoaded,\n  }\n}\n"],"names":["useStyleTag","globalState","id","initialCss","options","isLoaded","useRef","styleTag","defaultId","useCreation","toString","padStart","latestOptions","useLatest","useSafeState","css","setCss","load","useStableFn","isClient","current","media","document","getElementById","createElement","isConnected","head","appendChild","textContent","unload","removeChild","resetCss","useEffect","useUpdateEffect","useEffectOnce","immediate","manual"],"mappings":";;;;+BA4EgBA;;;eAAAA;;;qBA5EkB;2BACN;6BACE;yBACJ;4BACG;2BACD;+BACI;qBACP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEzB,IAAMC,cAAc,aAAa,GAAG;IAAEC,IAAI;AAAE;AAKrC,SAASF;QAAYG,aAAAA,iEAAa,IAAIC,UAAAA,iEAA8B,CAAC;IAC1E,IAAMC,WAAWC,IAAAA,aAAM,EAAC;IACxB,IAAMC,WAAWD,IAAAA,aAAM,EAA0B;IAEjD,kDAAkD;IAClD,IAAME,YAAYC,IAAAA,wBAAW,EAAC;QAC5B,IAAMP,KAAK,AAAC,CAAA,EAAED,YAAYC,EAAE,AAAD,EAAGQ,QAAQ,GAAGC,QAAQ,CAAC,GAAG;QACrD,OAAO,AAAC,qBAAuB,OAAHT;IAC9B;IAEA,IAAMU,gBAAgBC,IAAAA,oBAAS,EAACT;IAChC,IAAsBU,iCAAAA,IAAAA,0BAAY,EAACX,iBAA5BY,MAAeD,kBAAVE,SAAUF;IAEtB,IAAMG,OAAOC,IAAAA,wBAAW,EAAC;QACvB,IAAI,CAACC,eAAQ,EAAE;QACf,IAAkCP,yBAAAA,cAAcQ,OAAO,8BAArBR,uBAA1BV,IAAAA,4CAAKM,uCAAWa,QAAUT,uBAAVS;QACxBd,SAASa,OAAO,GAAIE,SAASC,cAAc,CAACrB,OAAOoB,SAASE,aAAa,CAAC;QAC1E,IAAI,CAACjB,SAASa,OAAO,CAACK,WAAW,EAAE;YACjClB,SAASa,OAAO,CAAClB,EAAE,GAAGA;YACtB,IAAImB,OAAOd,SAASa,OAAO,CAACC,KAAK,GAAGA;YACpCC,SAASI,IAAI,CAACC,WAAW,CAACpB,SAASa,OAAO;QAC5C;QACAb,SAASa,OAAO,CAACQ,WAAW,GAAGb;QAC/BV,SAASe,OAAO,GAAG;IACrB;IAEA,IAAMS,SAASX,IAAAA,wBAAW,EAAC;QACzB,IAAI,CAACI,YAAY,CAACjB,SAASe,OAAO,EAAE;QACpC,IAAMlB,KAAKU,cAAcQ,OAAO,CAAClB,EAAE,IAAIM;QACvCc,SAASI,IAAI,CAACI,WAAW,CAACR,SAASC,cAAc,CAACrB;QAClDG,SAASe,OAAO,GAAG;IACrB;IAEA,IAAMW,WAAWb,IAAAA,wBAAW,EAAC;eAAMF,OAAOb;;IAE1C6B,IAAAA,gBAAS,EAAC;QACR,IAAI,CAACzB,SAASa,OAAO,IAAI,CAACf,SAASe,OAAO,EAAE;QAC5Cb,SAASa,OAAO,CAACQ,WAAW,GAAGb;IACjC,GAAG;QAACA;KAAI;IAERkB,IAAAA,gCAAe,EAAC;eAAM,KAAM9B,CAAAA,cAAca,OAAOb,WAAU;OAAI;QAACA;KAAW;IAE3E+B,IAAAA,4BAAa,EAAC;QACZ,IAA6CtB,yBAAAA,cAAcQ,OAAO,qCAArBR,uBAArCuB,WAAAA,0DAAY,yEAAyBvB,uBAAnBwB,QAAAA,oDAAS;QACnCD,aAAa,CAACC,UAAUnB;QAExB,OAAO;YACL,IAA2BL,yBAAAA,cAAcQ,OAAO,kCAArBR,uBAAnBwB,QAAAA,oDAAS;YACjB,CAACA,UAAUP;QACb;IACF;IAEA,OAAO;QACL3B,IAAIU,cAAcQ,OAAO,CAAClB,EAAE,IAAIM;QAChCO,KAAAA;QACAC,QAAAA;QACAe,UAAAA;QACAd,MAAAA;QACAY,QAAAA;QACAtB,UAAUA;QACVF,UAAUA;IACZ;AACF"}