{"version":3,"sources":["../../src/useMatchMedia/index.ts"],"names":["useContext","RehydrationContext","useSyncExternalStore"],"mappings":";;;;;AAGA,IAAM,KAAA,uBAAY,GAA2B,EAAA;AAqB7C,IAAM,aAAA,GAAgB,CAAC,UAAuB,KAAA;AAC5C,EAAa,UAAA,GAAA,UAAA,CAAW,OAAQ,CAAA,cAAA,EAAgB,EAAE,CAAA;AAElD,EAAA,IAAI,CAAC,KAAA,CAAM,GAAI,CAAA,UAAU,CAAG,EAAA;AAC1B,IAAM,MAAA,GAAA,uBAAU,GAAgB,EAAA;AAEhC,IAAM,MAAA,cAAA,GAAiB,WAAW,UAAU,CAAA;AAE5C,IAAM,MAAA,SAAA,GAAY,CAAC,aAA8B,KAAA;AAC/C,MAAI,IAAA,CAAC,eAAe,QAAU,EAAA;AAC5B,QAAA,cAAA,CAAe,WAAW,MAAM;AAC9B,UAAM,MAAA,EAAA,GAAK,IAAI,MAAO,EAAA;AAEtB,UAAA,MAAM,IAAO,GAAA,EAAA,CAAG,IAAK,CAAA,IAAA,CAAK,EAAE,CAAA;AAE5B,UAAS,KAAA,IAAA,CAAA,GAAI,GAAI,CAAA,IAAA,EAAM,CAAO,EAAA,IAAA;AAC5B,YAAA,IAAA,GAAO,KAAM,EAAA;AAAA;AACf,SACF;AAAA;AAGF,MAAA,GAAA,CAAI,IAAI,aAAa,CAAA;AAErB,MAAA,OAAO,MAAM;AACX,QAAA,GAAA,CAAI,OAAO,aAAa,CAAA;AAExB,QAAI,IAAA,CAAC,IAAI,IAAM,EAAA;AACb,UAAA,cAAA,CAAe,QAAW,GAAA,IAAA;AAAA;AAC5B,OACF;AAAA,KACF;AAEA,IAAM,MAAA,QAAA,GAAW,MAAM,cAAe,CAAA,OAAA;AAEtC,IAAM,KAAA,CAAA,GAAA,CAAI,YAAY,MAAM;AAC1B,MAAM,MAAA,GAAA,GAAMA,iBAAWC,oCAAkB,CAAA;AAEzC,MAAO,OAAAC,0BAAA;AAAA,QACL,SAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA,KAAQ,MAAM,GAAA,CAAI,UAAU,CAAA;AAAA,OAC9B;AAAA,KACD,CAAA;AAAA;AAGH,EAAO,OAAA,KAAA,CAAM,GAAI,CAAA,UAAU,CAAG,EAAA;AAChC,CAAA;AAEA,IAAO,qBAAQ,GAAA","file":"chunk-DNZGFNT3.cjs","sourcesContent":["import { useSyncExternalStore, useContext } from \"react\";\nimport { RehydrationContext } from \"../utils/rehydration\";\n\nconst store = new Map<string, () => boolean>();\n\n/**\n * Custom hook that implements the behavior of the [matchMedia](https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia) method as a React hook.\n *\n * > In a Node environment, where media queries are not supported, you must use the [configureNodeEnv](https://github.com/Krombik/react-hook-media#configurenodeenv) method to simulate different device conditions, like in this [example](https://github.com/Krombik/react-hook-media#example).\n *\n * @example\n * ```js\n * // Usage in a React component\n * const isMobile = useMatchMedia('(max-width: 768px)');\n * if (isMobile) {\n *   // Render mobile layout\n * } else {\n *   // Render desktop layout\n * }\n * ```\n *\n * @param mediaQuery - The media query to be evaluated.\n * @returns  `true` if the media query matches, `false` otherwise.\n */\nconst useMatchMedia = (mediaQuery: string) => {\n  mediaQuery = mediaQuery.replace(/^@media( ?)/m, \"\");\n\n  if (!store.has(mediaQuery)) {\n    const set = new Set<() => void>();\n\n    const mediaQueryList = matchMedia(mediaQuery);\n\n    const subscribe = (onStoreChange: () => void) => {\n      if (!mediaQueryList.onchange) {\n        mediaQueryList.onchange = () => {\n          const it = set.values();\n\n          const next = it.next.bind(it);\n\n          for (let i = set.size; i--; ) {\n            next().value();\n          }\n        };\n      }\n\n      set.add(onStoreChange);\n\n      return () => {\n        set.delete(onStoreChange);\n\n        if (!set.size) {\n          mediaQueryList.onchange = null;\n        }\n      };\n    };\n\n    const getValue = () => mediaQueryList.matches;\n\n    store.set(mediaQuery, () => {\n      const ctx = useContext(RehydrationContext);\n\n      return useSyncExternalStore(\n        subscribe,\n        getValue,\n        ctx && (() => ctx[mediaQuery])\n      );\n    });\n  }\n\n  return store.get(mediaQuery)!();\n};\n\nexport default useMatchMedia;\n"]}