@usels/core 0.0.1-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/README.md +21 -0
  2. package/dist/browser/useEventListener/index.d.mts +56 -0
  3. package/dist/browser/useEventListener/index.d.ts +56 -0
  4. package/dist/browser/useEventListener/index.js +112 -0
  5. package/dist/browser/useEventListener/index.js.map +1 -0
  6. package/dist/browser/useEventListener/index.mjs +88 -0
  7. package/dist/browser/useEventListener/index.mjs.map +1 -0
  8. package/dist/browser/useMediaQuery/demo.d.mts +5 -0
  9. package/dist/browser/useMediaQuery/demo.d.ts +5 -0
  10. package/dist/browser/useMediaQuery/demo.js +82 -0
  11. package/dist/browser/useMediaQuery/demo.js.map +1 -0
  12. package/dist/browser/useMediaQuery/demo.mjs +62 -0
  13. package/dist/browser/useMediaQuery/demo.mjs.map +1 -0
  14. package/dist/browser/useMediaQuery/index.d.mts +11 -0
  15. package/dist/browser/useMediaQuery/index.d.ts +11 -0
  16. package/dist/browser/useMediaQuery/index.js +89 -0
  17. package/dist/browser/useMediaQuery/index.js.map +1 -0
  18. package/dist/browser/useMediaQuery/index.mjs +64 -0
  19. package/dist/browser/useMediaQuery/index.mjs.map +1 -0
  20. package/dist/components/Auto/index.d.mts +33 -0
  21. package/dist/components/Auto/index.d.ts +33 -0
  22. package/dist/components/Auto/index.js +66 -0
  23. package/dist/components/Auto/index.js.map +1 -0
  24. package/dist/components/Auto/index.mjs +34 -0
  25. package/dist/components/Auto/index.mjs.map +1 -0
  26. package/dist/elements/useDocumentVisibility/demo.d.mts +5 -0
  27. package/dist/elements/useDocumentVisibility/demo.d.ts +5 -0
  28. package/dist/elements/useDocumentVisibility/demo.js +130 -0
  29. package/dist/elements/useDocumentVisibility/demo.js.map +1 -0
  30. package/dist/elements/useDocumentVisibility/demo.mjs +114 -0
  31. package/dist/elements/useDocumentVisibility/demo.mjs.map +1 -0
  32. package/dist/elements/useDocumentVisibility/index.d.mts +5 -0
  33. package/dist/elements/useDocumentVisibility/index.d.ts +5 -0
  34. package/dist/elements/useDocumentVisibility/index.js +45 -0
  35. package/dist/elements/useDocumentVisibility/index.js.map +1 -0
  36. package/dist/elements/useDocumentVisibility/index.mjs +21 -0
  37. package/dist/elements/useDocumentVisibility/index.mjs.map +1 -0
  38. package/dist/elements/useElementBounding/demo.d.mts +5 -0
  39. package/dist/elements/useElementBounding/demo.d.ts +5 -0
  40. package/dist/elements/useElementBounding/demo.js +86 -0
  41. package/dist/elements/useElementBounding/demo.js.map +1 -0
  42. package/dist/elements/useElementBounding/demo.mjs +66 -0
  43. package/dist/elements/useElementBounding/demo.mjs.map +1 -0
  44. package/dist/elements/useElementBounding/index.d.mts +46 -0
  45. package/dist/elements/useElementBounding/index.d.ts +46 -0
  46. package/dist/elements/useElementBounding/index.js +122 -0
  47. package/dist/elements/useElementBounding/index.js.map +1 -0
  48. package/dist/elements/useElementBounding/index.mjs +98 -0
  49. package/dist/elements/useElementBounding/index.mjs.map +1 -0
  50. package/dist/elements/useElementSize/demo.d.mts +5 -0
  51. package/dist/elements/useElementSize/demo.d.ts +5 -0
  52. package/dist/elements/useElementSize/demo.js +82 -0
  53. package/dist/elements/useElementSize/demo.js.map +1 -0
  54. package/dist/elements/useElementSize/demo.mjs +62 -0
  55. package/dist/elements/useElementSize/demo.mjs.map +1 -0
  56. package/dist/elements/useElementSize/index.d.mts +34 -0
  57. package/dist/elements/useElementSize/index.d.ts +34 -0
  58. package/dist/elements/useElementSize/index.js +85 -0
  59. package/dist/elements/useElementSize/index.js.map +1 -0
  60. package/dist/elements/useElementSize/index.mjs +61 -0
  61. package/dist/elements/useElementSize/index.mjs.map +1 -0
  62. package/dist/elements/useElementVisibility/demo.d.mts +5 -0
  63. package/dist/elements/useElementVisibility/demo.d.ts +5 -0
  64. package/dist/elements/useElementVisibility/demo.js +110 -0
  65. package/dist/elements/useElementVisibility/demo.js.map +1 -0
  66. package/dist/elements/useElementVisibility/demo.mjs +90 -0
  67. package/dist/elements/useElementVisibility/demo.mjs.map +1 -0
  68. package/dist/elements/useElementVisibility/index.d.mts +43 -0
  69. package/dist/elements/useElementVisibility/index.d.ts +43 -0
  70. package/dist/elements/useElementVisibility/index.js +58 -0
  71. package/dist/elements/useElementVisibility/index.js.map +1 -0
  72. package/dist/elements/useElementVisibility/index.mjs +34 -0
  73. package/dist/elements/useElementVisibility/index.mjs.map +1 -0
  74. package/dist/elements/useIntersectionObserver/demo.d.mts +5 -0
  75. package/dist/elements/useIntersectionObserver/demo.d.ts +5 -0
  76. package/dist/elements/useIntersectionObserver/demo.js +173 -0
  77. package/dist/elements/useIntersectionObserver/demo.js.map +1 -0
  78. package/dist/elements/useIntersectionObserver/demo.mjs +153 -0
  79. package/dist/elements/useIntersectionObserver/demo.mjs.map +1 -0
  80. package/dist/elements/useIntersectionObserver/index.d.mts +47 -0
  81. package/dist/elements/useIntersectionObserver/index.d.ts +47 -0
  82. package/dist/elements/useIntersectionObserver/index.js +111 -0
  83. package/dist/elements/useIntersectionObserver/index.js.map +1 -0
  84. package/dist/elements/useIntersectionObserver/index.mjs +87 -0
  85. package/dist/elements/useIntersectionObserver/index.mjs.map +1 -0
  86. package/dist/elements/useMouseInElement/demo.d.mts +5 -0
  87. package/dist/elements/useMouseInElement/demo.d.ts +5 -0
  88. package/dist/elements/useMouseInElement/demo.js +103 -0
  89. package/dist/elements/useMouseInElement/demo.js.map +1 -0
  90. package/dist/elements/useMouseInElement/demo.mjs +83 -0
  91. package/dist/elements/useMouseInElement/demo.mjs.map +1 -0
  92. package/dist/elements/useMouseInElement/index.d.mts +56 -0
  93. package/dist/elements/useMouseInElement/index.d.ts +56 -0
  94. package/dist/elements/useMouseInElement/index.js +148 -0
  95. package/dist/elements/useMouseInElement/index.js.map +1 -0
  96. package/dist/elements/useMouseInElement/index.mjs +124 -0
  97. package/dist/elements/useMouseInElement/index.mjs.map +1 -0
  98. package/dist/elements/useMutationObserver/demo.d.mts +5 -0
  99. package/dist/elements/useMutationObserver/demo.d.ts +5 -0
  100. package/dist/elements/useMutationObserver/demo.js +240 -0
  101. package/dist/elements/useMutationObserver/demo.js.map +1 -0
  102. package/dist/elements/useMutationObserver/demo.mjs +220 -0
  103. package/dist/elements/useMutationObserver/demo.mjs.map +1 -0
  104. package/dist/elements/useMutationObserver/index.d.mts +15 -0
  105. package/dist/elements/useMutationObserver/index.d.ts +15 -0
  106. package/dist/elements/useMutationObserver/index.js +69 -0
  107. package/dist/elements/useMutationObserver/index.js.map +1 -0
  108. package/dist/elements/useMutationObserver/index.mjs +45 -0
  109. package/dist/elements/useMutationObserver/index.mjs.map +1 -0
  110. package/dist/elements/useParentElement/demo.d.mts +5 -0
  111. package/dist/elements/useParentElement/demo.d.ts +5 -0
  112. package/dist/elements/useParentElement/demo.js +132 -0
  113. package/dist/elements/useParentElement/demo.js.map +1 -0
  114. package/dist/elements/useParentElement/demo.mjs +112 -0
  115. package/dist/elements/useParentElement/demo.mjs.map +1 -0
  116. package/dist/elements/useParentElement/index.d.mts +7 -0
  117. package/dist/elements/useParentElement/index.d.ts +7 -0
  118. package/dist/elements/useParentElement/index.js +47 -0
  119. package/dist/elements/useParentElement/index.js.map +1 -0
  120. package/dist/elements/useParentElement/index.mjs +23 -0
  121. package/dist/elements/useParentElement/index.mjs.map +1 -0
  122. package/dist/elements/useRef$/index.js +89 -0
  123. package/dist/elements/useRef$/index.js.map +1 -0
  124. package/dist/elements/useRef$/index.mjs +62 -0
  125. package/dist/elements/useRef$/index.mjs.map +1 -0
  126. package/dist/elements/useRef_/index.d.mts +60 -0
  127. package/dist/elements/useRef_/index.d.ts +60 -0
  128. package/dist/elements/useResizeObserver/demo.d.mts +5 -0
  129. package/dist/elements/useResizeObserver/demo.d.ts +5 -0
  130. package/dist/elements/useResizeObserver/demo.js +90 -0
  131. package/dist/elements/useResizeObserver/demo.js.map +1 -0
  132. package/dist/elements/useResizeObserver/demo.mjs +70 -0
  133. package/dist/elements/useResizeObserver/demo.mjs.map +1 -0
  134. package/dist/elements/useResizeObserver/index.d.mts +36 -0
  135. package/dist/elements/useResizeObserver/index.d.ts +36 -0
  136. package/dist/elements/useResizeObserver/index.js +74 -0
  137. package/dist/elements/useResizeObserver/index.js.map +1 -0
  138. package/dist/elements/useResizeObserver/index.mjs +49 -0
  139. package/dist/elements/useResizeObserver/index.mjs.map +1 -0
  140. package/dist/elements/useWindowFocus/demo.d.mts +5 -0
  141. package/dist/elements/useWindowFocus/demo.d.ts +5 -0
  142. package/dist/elements/useWindowFocus/demo.js +100 -0
  143. package/dist/elements/useWindowFocus/demo.js.map +1 -0
  144. package/dist/elements/useWindowFocus/demo.mjs +80 -0
  145. package/dist/elements/useWindowFocus/demo.mjs.map +1 -0
  146. package/dist/elements/useWindowFocus/index.d.mts +5 -0
  147. package/dist/elements/useWindowFocus/index.d.ts +5 -0
  148. package/dist/elements/useWindowFocus/index.js +42 -0
  149. package/dist/elements/useWindowFocus/index.js.map +1 -0
  150. package/dist/elements/useWindowFocus/index.mjs +18 -0
  151. package/dist/elements/useWindowFocus/index.mjs.map +1 -0
  152. package/dist/elements/useWindowSize/demo.d.mts +5 -0
  153. package/dist/elements/useWindowSize/demo.d.ts +5 -0
  154. package/dist/elements/useWindowSize/demo.js +78 -0
  155. package/dist/elements/useWindowSize/demo.js.map +1 -0
  156. package/dist/elements/useWindowSize/demo.mjs +58 -0
  157. package/dist/elements/useWindowSize/demo.mjs.map +1 -0
  158. package/dist/elements/useWindowSize/index.d.mts +17 -0
  159. package/dist/elements/useWindowSize/index.d.ts +17 -0
  160. package/dist/elements/useWindowSize/index.js +96 -0
  161. package/dist/elements/useWindowSize/index.js.map +1 -0
  162. package/dist/elements/useWindowSize/index.mjs +76 -0
  163. package/dist/elements/useWindowSize/index.mjs.map +1 -0
  164. package/dist/function/get/index.d.mts +45 -0
  165. package/dist/function/get/index.d.ts +45 -0
  166. package/dist/function/get/index.js +39 -0
  167. package/dist/function/get/index.js.map +1 -0
  168. package/dist/function/get/index.mjs +15 -0
  169. package/dist/function/get/index.mjs.map +1 -0
  170. package/dist/function/peek/index.d.mts +46 -0
  171. package/dist/function/peek/index.d.ts +46 -0
  172. package/dist/function/peek/index.js +39 -0
  173. package/dist/function/peek/index.js.map +1 -0
  174. package/dist/function/peek/index.mjs +15 -0
  175. package/dist/function/peek/index.mjs.map +1 -0
  176. package/dist/function/useMayObservableOptions/index.d.mts +59 -0
  177. package/dist/function/useMayObservableOptions/index.d.ts +59 -0
  178. package/dist/function/useMayObservableOptions/index.js +109 -0
  179. package/dist/function/useMayObservableOptions/index.js.map +1 -0
  180. package/dist/function/useMayObservableOptions/index.mjs +88 -0
  181. package/dist/function/useMayObservableOptions/index.mjs.map +1 -0
  182. package/dist/function/useSupported/index.d.mts +6 -0
  183. package/dist/function/useSupported/index.d.ts +6 -0
  184. package/dist/function/useSupported/index.js +37 -0
  185. package/dist/function/useSupported/index.js.map +1 -0
  186. package/dist/function/useSupported/index.mjs +13 -0
  187. package/dist/function/useSupported/index.mjs.map +1 -0
  188. package/dist/function/useWhenMounted/index.d.mts +6 -0
  189. package/dist/function/useWhenMounted/index.d.ts +6 -0
  190. package/dist/function/useWhenMounted/index.js +37 -0
  191. package/dist/function/useWhenMounted/index.js.map +1 -0
  192. package/dist/function/useWhenMounted/index.mjs +13 -0
  193. package/dist/function/useWhenMounted/index.mjs.map +1 -0
  194. package/dist/index.d.mts +24 -0
  195. package/dist/index.d.ts +24 -0
  196. package/dist/index.js +63 -0
  197. package/dist/index.js.map +1 -0
  198. package/dist/index.mjs +22 -0
  199. package/dist/index.mjs.map +1 -0
  200. package/dist/sensors/useScroll/demo.d.mts +5 -0
  201. package/dist/sensors/useScroll/demo.d.ts +5 -0
  202. package/dist/sensors/useScroll/demo.js +121 -0
  203. package/dist/sensors/useScroll/demo.js.map +1 -0
  204. package/dist/sensors/useScroll/demo.mjs +101 -0
  205. package/dist/sensors/useScroll/demo.mjs.map +1 -0
  206. package/dist/sensors/useScroll/index.d.mts +42 -0
  207. package/dist/sensors/useScroll/index.d.ts +42 -0
  208. package/dist/sensors/useScroll/index.js +149 -0
  209. package/dist/sensors/useScroll/index.js.map +1 -0
  210. package/dist/sensors/useScroll/index.mjs +125 -0
  211. package/dist/sensors/useScroll/index.mjs.map +1 -0
  212. package/dist/sensors/useWindowScroll/demo.d.mts +5 -0
  213. package/dist/sensors/useWindowScroll/demo.d.ts +5 -0
  214. package/dist/sensors/useWindowScroll/demo.js +84 -0
  215. package/dist/sensors/useWindowScroll/demo.js.map +1 -0
  216. package/dist/sensors/useWindowScroll/demo.mjs +64 -0
  217. package/dist/sensors/useWindowScroll/demo.mjs.map +1 -0
  218. package/dist/sensors/useWindowScroll/index.d.mts +9 -0
  219. package/dist/sensors/useWindowScroll/index.d.ts +9 -0
  220. package/dist/sensors/useWindowScroll/index.js +36 -0
  221. package/dist/sensors/useWindowScroll/index.js.map +1 -0
  222. package/dist/sensors/useWindowScroll/index.mjs +12 -0
  223. package/dist/sensors/useWindowScroll/index.mjs.map +1 -0
  224. package/dist/shared/configurable.d.mts +21 -0
  225. package/dist/shared/configurable.d.ts +21 -0
  226. package/dist/shared/configurable.js +39 -0
  227. package/dist/shared/configurable.js.map +1 -0
  228. package/dist/shared/configurable.mjs +12 -0
  229. package/dist/shared/configurable.mjs.map +1 -0
  230. package/dist/shared/index.d.mts +4 -0
  231. package/dist/shared/index.d.ts +4 -0
  232. package/dist/shared/index.js +31 -0
  233. package/dist/shared/index.js.map +1 -0
  234. package/dist/shared/index.mjs +7 -0
  235. package/dist/shared/index.mjs.map +1 -0
  236. package/dist/shared/normalizeTargets/index.d.mts +21 -0
  237. package/dist/shared/normalizeTargets/index.d.ts +21 -0
  238. package/dist/shared/normalizeTargets/index.js +36 -0
  239. package/dist/shared/normalizeTargets/index.js.map +1 -0
  240. package/dist/shared/normalizeTargets/index.mjs +12 -0
  241. package/dist/shared/normalizeTargets/index.mjs.map +1 -0
  242. package/dist/shared/utils.d.mts +15 -0
  243. package/dist/shared/utils.d.ts +15 -0
  244. package/dist/shared/utils.js +87 -0
  245. package/dist/shared/utils.js.map +1 -0
  246. package/dist/shared/utils.mjs +52 -0
  247. package/dist/shared/utils.mjs.map +1 -0
  248. package/dist/types.d.mts +52 -0
  249. package/dist/types.d.ts +52 -0
  250. package/dist/types.js +17 -0
  251. package/dist/types.js.map +1 -0
  252. package/dist/types.mjs +1 -0
  253. package/dist/types.mjs.map +1 -0
  254. package/package.json +54 -0
  255. package/src/browser/useEventListener/index.md +109 -0
  256. package/src/browser/useEventListener/index.spec.ts +611 -0
  257. package/src/browser/useEventListener/index.ts +242 -0
  258. package/src/browser/useMediaQuery/demo.tsx +58 -0
  259. package/src/browser/useMediaQuery/index.md +40 -0
  260. package/src/browser/useMediaQuery/index.spec.ts +267 -0
  261. package/src/browser/useMediaQuery/index.ts +96 -0
  262. package/src/components/Auto/index.tsx +65 -0
  263. package/src/elements/useDocumentVisibility/demo.tsx +111 -0
  264. package/src/elements/useDocumentVisibility/index.md +51 -0
  265. package/src/elements/useDocumentVisibility/index.spec.ts +114 -0
  266. package/src/elements/useDocumentVisibility/index.ts +26 -0
  267. package/src/elements/useElementBounding/demo.tsx +63 -0
  268. package/src/elements/useElementBounding/index.md +59 -0
  269. package/src/elements/useElementBounding/index.ts +159 -0
  270. package/src/elements/useElementSize/demo.tsx +48 -0
  271. package/src/elements/useElementSize/index.md +60 -0
  272. package/src/elements/useElementSize/index.spec.ts +295 -0
  273. package/src/elements/useElementSize/index.ts +100 -0
  274. package/src/elements/useElementVisibility/deep-observable-pattern.spec.ts +453 -0
  275. package/src/elements/useElementVisibility/demo.tsx +97 -0
  276. package/src/elements/useElementVisibility/index.md +98 -0
  277. package/src/elements/useElementVisibility/index.spec.ts +227 -0
  278. package/src/elements/useElementVisibility/index.ts +78 -0
  279. package/src/elements/useIntersectionObserver/demo.tsx +180 -0
  280. package/src/elements/useIntersectionObserver/index.md +99 -0
  281. package/src/elements/useIntersectionObserver/index.spec.ts +482 -0
  282. package/src/elements/useIntersectionObserver/index.ts +149 -0
  283. package/src/elements/useMouseInElement/demo.tsx +79 -0
  284. package/src/elements/useMouseInElement/index.md +71 -0
  285. package/src/elements/useMouseInElement/index.spec.ts +398 -0
  286. package/src/elements/useMouseInElement/index.ts +209 -0
  287. package/src/elements/useMutationObserver/demo.tsx +270 -0
  288. package/src/elements/useMutationObserver/index.md +99 -0
  289. package/src/elements/useMutationObserver/index.spec.ts +421 -0
  290. package/src/elements/useMutationObserver/index.ts +66 -0
  291. package/src/elements/useParentElement/demo.tsx +120 -0
  292. package/src/elements/useParentElement/index.md +67 -0
  293. package/src/elements/useParentElement/index.spec.ts +208 -0
  294. package/src/elements/useParentElement/index.ts +35 -0
  295. package/src/elements/useRef$/index.md +62 -0
  296. package/src/elements/useRef$/index.spec.ts +205 -0
  297. package/src/elements/useRef$/index.ts +137 -0
  298. package/src/elements/useRef$/useImperativeHandle.spec.ts +339 -0
  299. package/src/elements/useResizeObserver/demo.tsx +56 -0
  300. package/src/elements/useResizeObserver/index.md +51 -0
  301. package/src/elements/useResizeObserver/index.spec.ts +312 -0
  302. package/src/elements/useResizeObserver/index.ts +106 -0
  303. package/src/elements/useWindowFocus/demo.tsx +71 -0
  304. package/src/elements/useWindowFocus/index.md +35 -0
  305. package/src/elements/useWindowFocus/index.spec.ts +103 -0
  306. package/src/elements/useWindowFocus/index.ts +21 -0
  307. package/src/elements/useWindowSize/demo.tsx +46 -0
  308. package/src/elements/useWindowSize/index.md +50 -0
  309. package/src/elements/useWindowSize/index.spec.ts +310 -0
  310. package/src/elements/useWindowSize/index.ts +107 -0
  311. package/src/function/get/index.md +25 -0
  312. package/src/function/get/index.spec.ts +87 -0
  313. package/src/function/get/index.ts +70 -0
  314. package/src/function/peek/index.spec.ts +97 -0
  315. package/src/function/peek/index.ts +69 -0
  316. package/src/function/useMayObservableOptions/index.spec.ts +521 -0
  317. package/src/function/useMayObservableOptions/index.ts +173 -0
  318. package/src/function/useSupported/index.md +38 -0
  319. package/src/function/useSupported/index.spec.ts +116 -0
  320. package/src/function/useSupported/index.ts +14 -0
  321. package/src/function/useWhenMounted/index.md +25 -0
  322. package/src/function/useWhenMounted/index.spec.ts +120 -0
  323. package/src/function/useWhenMounted/index.ts +16 -0
  324. package/src/index.ts +25 -0
  325. package/src/sensors/useScroll/demo.tsx +98 -0
  326. package/src/sensors/useScroll/index.md +112 -0
  327. package/src/sensors/useScroll/index.spec.ts +678 -0
  328. package/src/sensors/useScroll/index.ts +201 -0
  329. package/src/sensors/useWindowScroll/demo.tsx +69 -0
  330. package/src/sensors/useWindowScroll/index.md +88 -0
  331. package/src/sensors/useWindowScroll/index.spec.ts +69 -0
  332. package/src/sensors/useWindowScroll/index.ts +11 -0
  333. package/src/shared/configurable.ts +35 -0
  334. package/src/shared/index.ts +4 -0
  335. package/src/shared/normalizeTargets/index.spec.ts +76 -0
  336. package/src/shared/normalizeTargets/index.ts +27 -0
  337. package/src/shared/utils.ts +67 -0
  338. package/src/types.ts +56 -0
  339. package/tsconfig.json +9 -0
  340. package/tsup.config.ts +10 -0
  341. package/vitest.config.ts +22 -0
package/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # @usels/core
2
+
3
+ Utility functions for Legend-State and general TypeScript/JavaScript development.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @usels/core
9
+ ```
10
+
11
+ ## Features
12
+
13
+ - **Type-safe utilities** - Full TypeScript support with type guards
14
+ - **Observable utilities** - MaybeObservable pattern for flexible value handling
15
+ - **Tree-shakeable** - Only import what you need
16
+ - **Zero dependencies** - Lightweight and fast (Legend-State is a peer dependency)
17
+ - **ESM & CJS** - Support for both module systems
18
+
19
+ ## License
20
+
21
+ MIT
@@ -0,0 +1,56 @@
1
+ import { Observable } from '@legendapp/state';
2
+ import { MaybeElement } from '../../elements/useRef_/index.mjs';
3
+ import { Arrayable, MaybeObservable } from '../../types.mjs';
4
+ import 'react';
5
+
6
+ interface GeneralEventListener<E = Event> {
7
+ (evt: E): void;
8
+ }
9
+ /**
10
+ * Register using addEventListener on mounted, and removeEventListener
11
+ * automatically on unmounted.
12
+ *
13
+ * Overload 1: Omitted target — defaults to `window`.
14
+ */
15
+ declare function useEventListener<E extends keyof WindowEventMap>(event: Arrayable<E>, listener: Arrayable<(ev: WindowEventMap[E]) => any>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
16
+ /**
17
+ * Register using addEventListener on mounted, and removeEventListener
18
+ * automatically on unmounted.
19
+ *
20
+ * Overload 2: Explicit `Window` target.
21
+ */
22
+ declare function useEventListener<E extends keyof WindowEventMap>(target: Window, event: Arrayable<E>, listener: Arrayable<(ev: WindowEventMap[E]) => any>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
23
+ /**
24
+ * Register using addEventListener on mounted, and removeEventListener
25
+ * automatically on unmounted.
26
+ *
27
+ * Overload 3: Explicit `Document` target.
28
+ */
29
+ declare function useEventListener<E extends keyof DocumentEventMap>(target: Document, event: Arrayable<E>, listener: Arrayable<(ev: DocumentEventMap[E]) => any>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
30
+ /**
31
+ * Register using addEventListener on mounted, and removeEventListener
32
+ * automatically on unmounted.
33
+ *
34
+ * Overload 4: `MaybeElement` target — supports Ref$, Observable<OpaqueObject<Element>>,
35
+ * Document, Window, or an array of those (Legend-State reactive).
36
+ * Raw HTMLElement is excluded — use Ref$ or Observable<OpaqueObject<Element>> instead.
37
+ */
38
+ declare function useEventListener<E extends keyof HTMLElementEventMap>(target: MaybeElement | MaybeElement[] | null | undefined, event: Arrayable<E>, listener: Arrayable<(ev: HTMLElementEventMap[E]) => any>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
39
+ /**
40
+ * Register using addEventListener on mounted, and removeEventListener
41
+ * automatically on unmounted.
42
+ *
43
+ * Overload 5: Observable<EventTarget> — reactive target (e.g.
44
+ * Observable<MediaQueryList>, Ref$<HTMLElement>, etc.).
45
+ * The observer re-fires whenever the observable value changes.
46
+ */
47
+ declare function useEventListener<EventType = Event>(target: Observable<any>, event: Arrayable<string>, listener: Arrayable<GeneralEventListener<EventType>>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
48
+ /**
49
+ * Register using addEventListener on mounted, and removeEventListener
50
+ * automatically on unmounted.
51
+ *
52
+ * Overload 6: Generic `EventTarget` fallback.
53
+ */
54
+ declare function useEventListener<EventType = Event>(target: EventTarget | null | undefined, event: Arrayable<string>, listener: Arrayable<GeneralEventListener<EventType>>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
55
+
56
+ export { type GeneralEventListener, useEventListener };
@@ -0,0 +1,56 @@
1
+ import { Observable } from '@legendapp/state';
2
+ import { MaybeElement } from '../../elements/useRef_/index.js';
3
+ import { Arrayable, MaybeObservable } from '../../types.js';
4
+ import 'react';
5
+
6
+ interface GeneralEventListener<E = Event> {
7
+ (evt: E): void;
8
+ }
9
+ /**
10
+ * Register using addEventListener on mounted, and removeEventListener
11
+ * automatically on unmounted.
12
+ *
13
+ * Overload 1: Omitted target — defaults to `window`.
14
+ */
15
+ declare function useEventListener<E extends keyof WindowEventMap>(event: Arrayable<E>, listener: Arrayable<(ev: WindowEventMap[E]) => any>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
16
+ /**
17
+ * Register using addEventListener on mounted, and removeEventListener
18
+ * automatically on unmounted.
19
+ *
20
+ * Overload 2: Explicit `Window` target.
21
+ */
22
+ declare function useEventListener<E extends keyof WindowEventMap>(target: Window, event: Arrayable<E>, listener: Arrayable<(ev: WindowEventMap[E]) => any>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
23
+ /**
24
+ * Register using addEventListener on mounted, and removeEventListener
25
+ * automatically on unmounted.
26
+ *
27
+ * Overload 3: Explicit `Document` target.
28
+ */
29
+ declare function useEventListener<E extends keyof DocumentEventMap>(target: Document, event: Arrayable<E>, listener: Arrayable<(ev: DocumentEventMap[E]) => any>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
30
+ /**
31
+ * Register using addEventListener on mounted, and removeEventListener
32
+ * automatically on unmounted.
33
+ *
34
+ * Overload 4: `MaybeElement` target — supports Ref$, Observable<OpaqueObject<Element>>,
35
+ * Document, Window, or an array of those (Legend-State reactive).
36
+ * Raw HTMLElement is excluded — use Ref$ or Observable<OpaqueObject<Element>> instead.
37
+ */
38
+ declare function useEventListener<E extends keyof HTMLElementEventMap>(target: MaybeElement | MaybeElement[] | null | undefined, event: Arrayable<E>, listener: Arrayable<(ev: HTMLElementEventMap[E]) => any>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
39
+ /**
40
+ * Register using addEventListener on mounted, and removeEventListener
41
+ * automatically on unmounted.
42
+ *
43
+ * Overload 5: Observable<EventTarget> — reactive target (e.g.
44
+ * Observable<MediaQueryList>, Ref$<HTMLElement>, etc.).
45
+ * The observer re-fires whenever the observable value changes.
46
+ */
47
+ declare function useEventListener<EventType = Event>(target: Observable<any>, event: Arrayable<string>, listener: Arrayable<GeneralEventListener<EventType>>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
48
+ /**
49
+ * Register using addEventListener on mounted, and removeEventListener
50
+ * automatically on unmounted.
51
+ *
52
+ * Overload 6: Generic `EventTarget` fallback.
53
+ */
54
+ declare function useEventListener<EventType = Event>(target: EventTarget | null | undefined, event: Arrayable<string>, listener: Arrayable<GeneralEventListener<EventType>>, options?: MaybeObservable<boolean | AddEventListenerOptions>): () => void;
55
+
56
+ export { type GeneralEventListener, useEventListener };
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ "use client";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var useEventListener_exports = {};
21
+ __export(useEventListener_exports, {
22
+ useEventListener: () => useEventListener
23
+ });
24
+ module.exports = __toCommonJS(useEventListener_exports);
25
+ var import_state = require("@legendapp/state");
26
+ var import_react = require("@legendapp/state/react");
27
+ var import_react2 = require("react");
28
+ var import_useRef = require("../../elements/useRef$");
29
+ var import_normalizeTargets = require("../../shared/normalizeTargets");
30
+ var import_get = require("../../function/get");
31
+ var import_utils = require("../../shared/utils");
32
+ function isEventNameArg(v) {
33
+ if (typeof v === "string") return true;
34
+ if (Array.isArray(v)) {
35
+ const nonNull = v.filter((item) => item != null);
36
+ return nonNull.length > 0 && nonNull.every((item) => typeof item === "string");
37
+ }
38
+ return false;
39
+ }
40
+ function useEventListener(...args) {
41
+ const hasTarget = !isEventNameArg(args[0]);
42
+ const rawTarget = hasTarget ? args[0] : void 0;
43
+ const rawEvent = hasTarget ? args[1] : args[0];
44
+ const rawListener = hasTarget ? args[2] : args[1];
45
+ const rawOptions = hasTarget ? args[3] : args[2];
46
+ const listenersRef = (0, import_react2.useRef)((0, import_utils.toArray)(rawListener));
47
+ listenersRef.current = (0, import_utils.toArray)(rawListener);
48
+ const forwarder = (0, import_react2.useRef)((ev) => {
49
+ listenersRef.current.forEach((l) => l(ev));
50
+ });
51
+ const optionsRef = (0, import_react2.useRef)(rawOptions);
52
+ optionsRef.current = rawOptions;
53
+ const mounted$ = (0, import_react.useObservable)(false);
54
+ const cleanupsRef = (0, import_react2.useRef)([]);
55
+ (0, import_react.useObserve)(() => {
56
+ cleanupsRef.current.forEach((fn2) => fn2());
57
+ cleanupsRef.current = [];
58
+ if (!mounted$.get()) return;
59
+ const targets = (() => {
60
+ if (!hasTarget) {
61
+ return typeof window !== "undefined" ? [window] : [];
62
+ }
63
+ if (rawTarget == null) return [];
64
+ const items = Array.isArray(rawTarget) ? rawTarget : [rawTarget];
65
+ return items.flatMap((item) => {
66
+ if (item == null) return [];
67
+ if ((0, import_useRef.isRef$)(item)) {
68
+ return (0, import_normalizeTargets.normalizeTargets)([item]);
69
+ }
70
+ if ((0, import_state.isObservable)(item)) {
71
+ const val = item.get();
72
+ if (val == null) return [];
73
+ const target = typeof val.valueOf === "function" ? val.valueOf() ?? val : val;
74
+ if (typeof target.addEventListener === "function") {
75
+ return [target];
76
+ }
77
+ return [];
78
+ }
79
+ return [item];
80
+ });
81
+ })();
82
+ if (!targets.length) return;
83
+ const events = (0, import_utils.toArray)(rawEvent);
84
+ if (!events.length || !listenersRef.current.length) return;
85
+ const resolvedOpts = (0, import_get.get)(optionsRef.current);
86
+ const opts = typeof resolvedOpts === "object" && resolvedOpts !== null ? { ...resolvedOpts } : resolvedOpts;
87
+ const fn = forwarder.current;
88
+ cleanupsRef.current = targets.flatMap(
89
+ (el) => events.map((event) => {
90
+ el.addEventListener(event, fn, opts);
91
+ return () => el.removeEventListener(event, fn, opts);
92
+ })
93
+ );
94
+ });
95
+ (0, import_react2.useEffect)(() => {
96
+ mounted$.set(true);
97
+ return () => {
98
+ mounted$.set(false);
99
+ cleanupsRef.current.forEach((fn) => fn());
100
+ cleanupsRef.current = [];
101
+ };
102
+ }, []);
103
+ return () => {
104
+ cleanupsRef.current.forEach((fn) => fn());
105
+ cleanupsRef.current = [];
106
+ };
107
+ }
108
+ // Annotate the CommonJS export names for ESM import in node:
109
+ 0 && (module.exports = {
110
+ useEventListener
111
+ });
112
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser/useEventListener/index.ts"],"sourcesContent":["\"use client\";\nimport { isObservable, type Observable } from \"@legendapp/state\";\nimport { useObservable, useObserve } from \"@legendapp/state/react\";\nimport { useEffect, useRef } from \"react\";\nimport { isRef$, type MaybeElement } from \"../../elements/useRef$\";\nimport { normalizeTargets } from \"../../shared/normalizeTargets\";\nimport { get } from \"../../function/get\";\nimport type { Arrayable, MaybeObservable } from \"../../types\";\nimport { toArray } from \"../../shared/utils\";\n\n/**\n * Returns true if the value looks like an event name argument (string or\n * array of strings), meaning no explicit target was provided.\n */\nfunction isEventNameArg(v: unknown): boolean {\n if (typeof v === \"string\") return true;\n if (Array.isArray(v)) {\n const nonNull = v.filter((item) => item != null);\n return (\n nonNull.length > 0 && nonNull.every((item) => typeof item === \"string\")\n );\n }\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface GeneralEventListener<E = Event> {\n (evt: E): void;\n}\n\n// ---------------------------------------------------------------------------\n// Overloads\n// ---------------------------------------------------------------------------\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 1: Omitted target — defaults to `window`.\n */\nexport function useEventListener<E extends keyof WindowEventMap>(\n event: Arrayable<E>,\n listener: Arrayable<(ev: WindowEventMap[E]) => any>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 2: Explicit `Window` target.\n */\nexport function useEventListener<E extends keyof WindowEventMap>(\n target: Window,\n event: Arrayable<E>,\n listener: Arrayable<(ev: WindowEventMap[E]) => any>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 3: Explicit `Document` target.\n */\nexport function useEventListener<E extends keyof DocumentEventMap>(\n target: Document,\n event: Arrayable<E>,\n listener: Arrayable<(ev: DocumentEventMap[E]) => any>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 4: `MaybeElement` target — supports Ref$, Observable<OpaqueObject<Element>>,\n * Document, Window, or an array of those (Legend-State reactive).\n * Raw HTMLElement is excluded — use Ref$ or Observable<OpaqueObject<Element>> instead.\n */\nexport function useEventListener<E extends keyof HTMLElementEventMap>(\n target: MaybeElement | MaybeElement[] | null | undefined,\n event: Arrayable<E>,\n listener: Arrayable<(ev: HTMLElementEventMap[E]) => any>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 5: Observable<EventTarget> — reactive target (e.g.\n * Observable<MediaQueryList>, Ref$<HTMLElement>, etc.).\n * The observer re-fires whenever the observable value changes.\n */\nexport function useEventListener<EventType = Event>(\n target: Observable<any>,\n event: Arrayable<string>,\n listener: Arrayable<GeneralEventListener<EventType>>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 6: Generic `EventTarget` fallback.\n */\nexport function useEventListener<EventType = Event>(\n target: EventTarget | null | undefined,\n event: Arrayable<string>,\n listener: Arrayable<GeneralEventListener<EventType>>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nexport function useEventListener(...args: any[]): () => void {\n // Detect whether first arg is an event name (no target) or a target.\n // Mirrors VueUse's firstParamTargets check.\n const hasTarget = !isEventNameArg(args[0]);\n\n const rawTarget: unknown = hasTarget ? args[0] : undefined;\n const rawEvent: Arrayable<string> = hasTarget ? args[1] : args[0];\n const rawListener: Arrayable<(...a: any[]) => any> = hasTarget\n ? args[2]\n : args[1];\n const rawOptions: MaybeObservable<boolean | AddEventListenerOptions> | undefined = hasTarget\n ? args[3]\n : args[2];\n\n // Always keep the latest listeners in a ref so that the forwarder always\n // calls the current listeners, even after re-renders change the functions.\n const listenersRef = useRef(toArray(rawListener));\n listenersRef.current = toArray(rawListener);\n\n // Stable forwarder — one function reference per hook instance, created once.\n const forwarder = useRef((ev: Event) => {\n listenersRef.current.forEach((l) => l(ev));\n });\n\n // Options ref prevents recreating listeners when only options change.\n const optionsRef = useRef(rawOptions);\n optionsRef.current = rawOptions;\n\n // Observable mount flag — lets useObserve react when component mounts.\n const mounted$ = useObservable(false);\n\n // Array of removeEventListener thunks for the currently active registrations.\n const cleanupsRef = useRef<Array<() => void>>([]);\n\n // Single reactive observer: re-runs whenever mounted$ changes OR any\n // observable target changes. Reading .get() inside this callback registers\n // reactive dependencies, so listener setup/teardown is always in sync.\n useObserve(() => {\n // Teardown previous registrations before re-registering.\n cleanupsRef.current.forEach((fn) => fn());\n cleanupsRef.current = [];\n\n // Only register listeners while the component is mounted.\n if (!mounted$.get()) return;\n\n // Resolve targets inline — reading .get() on observable targets registers\n // them as reactive dependencies for this observer.\n const targets: EventTarget[] = (() => {\n if (!hasTarget) {\n return typeof window !== \"undefined\" ? [window] : [];\n }\n if (rawTarget == null) return [];\n\n const items: unknown[] = Array.isArray(rawTarget)\n ? rawTarget\n : [rawTarget];\n return items.flatMap((item): EventTarget[] => {\n if (item == null) return [];\n // Ref$ references — normalizeTargets handles OpaqueObject.valueOf() unwrapping.\n if (isRef$(item)) {\n return normalizeTargets([item as MaybeElement]) as EventTarget[];\n }\n // Observable targets — .get() unwraps and registers reactive dependency.\n // Supports Element, Document, MediaQueryList, or any EventTarget.\n if (isObservable(item)) {\n const val = (item as { get: () => unknown }).get();\n if (val == null) return [];\n // Unwrap OpaqueObject created by ObservableHint.opaque (has custom valueOf).\n const target =\n typeof (val as any).valueOf === \"function\"\n ? ((val as any).valueOf() as unknown) ?? val\n : val;\n // Duck-type check: works with real EventTargets and test mocks alike.\n if (typeof (target as any).addEventListener === \"function\") {\n return [target as EventTarget];\n }\n return [];\n }\n // Raw EventTarget (Window, Document — stable singletons)\n return [item as EventTarget];\n });\n })();\n\n if (!targets.length) return;\n\n const events = toArray(rawEvent);\n if (!events.length || !listenersRef.current.length) return;\n\n const resolvedOpts = get(optionsRef.current);\n const opts =\n typeof resolvedOpts === \"object\" && resolvedOpts !== null\n ? { ...resolvedOpts }\n : resolvedOpts;\n\n const fn = forwarder.current;\n cleanupsRef.current = targets.flatMap((el) =>\n events.map((event) => {\n el.addEventListener(event, fn, opts);\n return () => el.removeEventListener(event, fn, opts);\n }),\n );\n });\n\n // useEffect manages mount state only — no setup logic here.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n mounted$.set(true);\n return () => {\n mounted$.set(false);\n cleanupsRef.current.forEach((fn) => fn());\n cleanupsRef.current = [];\n };\n }, []);\n\n // Return a manual cleanup function for imperative removal.\n return () => {\n cleanupsRef.current.forEach((fn) => fn());\n cleanupsRef.current = [];\n };\n}\n"],"mappings":"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","names":["import_react","fn"]}
@@ -0,0 +1,88 @@
1
+ "use client";
2
+ import { isObservable } from "@legendapp/state";
3
+ import { useObservable, useObserve } from "@legendapp/state/react";
4
+ import { useEffect, useRef } from "react";
5
+ import { isRef$ } from "../../elements/useRef$";
6
+ import { normalizeTargets } from "../../shared/normalizeTargets";
7
+ import { get } from "../../function/get";
8
+ import { toArray } from "../../shared/utils";
9
+ function isEventNameArg(v) {
10
+ if (typeof v === "string") return true;
11
+ if (Array.isArray(v)) {
12
+ const nonNull = v.filter((item) => item != null);
13
+ return nonNull.length > 0 && nonNull.every((item) => typeof item === "string");
14
+ }
15
+ return false;
16
+ }
17
+ function useEventListener(...args) {
18
+ const hasTarget = !isEventNameArg(args[0]);
19
+ const rawTarget = hasTarget ? args[0] : void 0;
20
+ const rawEvent = hasTarget ? args[1] : args[0];
21
+ const rawListener = hasTarget ? args[2] : args[1];
22
+ const rawOptions = hasTarget ? args[3] : args[2];
23
+ const listenersRef = useRef(toArray(rawListener));
24
+ listenersRef.current = toArray(rawListener);
25
+ const forwarder = useRef((ev) => {
26
+ listenersRef.current.forEach((l) => l(ev));
27
+ });
28
+ const optionsRef = useRef(rawOptions);
29
+ optionsRef.current = rawOptions;
30
+ const mounted$ = useObservable(false);
31
+ const cleanupsRef = useRef([]);
32
+ useObserve(() => {
33
+ cleanupsRef.current.forEach((fn2) => fn2());
34
+ cleanupsRef.current = [];
35
+ if (!mounted$.get()) return;
36
+ const targets = (() => {
37
+ if (!hasTarget) {
38
+ return typeof window !== "undefined" ? [window] : [];
39
+ }
40
+ if (rawTarget == null) return [];
41
+ const items = Array.isArray(rawTarget) ? rawTarget : [rawTarget];
42
+ return items.flatMap((item) => {
43
+ if (item == null) return [];
44
+ if (isRef$(item)) {
45
+ return normalizeTargets([item]);
46
+ }
47
+ if (isObservable(item)) {
48
+ const val = item.get();
49
+ if (val == null) return [];
50
+ const target = typeof val.valueOf === "function" ? val.valueOf() ?? val : val;
51
+ if (typeof target.addEventListener === "function") {
52
+ return [target];
53
+ }
54
+ return [];
55
+ }
56
+ return [item];
57
+ });
58
+ })();
59
+ if (!targets.length) return;
60
+ const events = toArray(rawEvent);
61
+ if (!events.length || !listenersRef.current.length) return;
62
+ const resolvedOpts = get(optionsRef.current);
63
+ const opts = typeof resolvedOpts === "object" && resolvedOpts !== null ? { ...resolvedOpts } : resolvedOpts;
64
+ const fn = forwarder.current;
65
+ cleanupsRef.current = targets.flatMap(
66
+ (el) => events.map((event) => {
67
+ el.addEventListener(event, fn, opts);
68
+ return () => el.removeEventListener(event, fn, opts);
69
+ })
70
+ );
71
+ });
72
+ useEffect(() => {
73
+ mounted$.set(true);
74
+ return () => {
75
+ mounted$.set(false);
76
+ cleanupsRef.current.forEach((fn) => fn());
77
+ cleanupsRef.current = [];
78
+ };
79
+ }, []);
80
+ return () => {
81
+ cleanupsRef.current.forEach((fn) => fn());
82
+ cleanupsRef.current = [];
83
+ };
84
+ }
85
+ export {
86
+ useEventListener
87
+ };
88
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser/useEventListener/index.ts"],"sourcesContent":["\"use client\";\nimport { isObservable, type Observable } from \"@legendapp/state\";\nimport { useObservable, useObserve } from \"@legendapp/state/react\";\nimport { useEffect, useRef } from \"react\";\nimport { isRef$, type MaybeElement } from \"../../elements/useRef$\";\nimport { normalizeTargets } from \"../../shared/normalizeTargets\";\nimport { get } from \"../../function/get\";\nimport type { Arrayable, MaybeObservable } from \"../../types\";\nimport { toArray } from \"../../shared/utils\";\n\n/**\n * Returns true if the value looks like an event name argument (string or\n * array of strings), meaning no explicit target was provided.\n */\nfunction isEventNameArg(v: unknown): boolean {\n if (typeof v === \"string\") return true;\n if (Array.isArray(v)) {\n const nonNull = v.filter((item) => item != null);\n return (\n nonNull.length > 0 && nonNull.every((item) => typeof item === \"string\")\n );\n }\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface GeneralEventListener<E = Event> {\n (evt: E): void;\n}\n\n// ---------------------------------------------------------------------------\n// Overloads\n// ---------------------------------------------------------------------------\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 1: Omitted target — defaults to `window`.\n */\nexport function useEventListener<E extends keyof WindowEventMap>(\n event: Arrayable<E>,\n listener: Arrayable<(ev: WindowEventMap[E]) => any>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 2: Explicit `Window` target.\n */\nexport function useEventListener<E extends keyof WindowEventMap>(\n target: Window,\n event: Arrayable<E>,\n listener: Arrayable<(ev: WindowEventMap[E]) => any>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 3: Explicit `Document` target.\n */\nexport function useEventListener<E extends keyof DocumentEventMap>(\n target: Document,\n event: Arrayable<E>,\n listener: Arrayable<(ev: DocumentEventMap[E]) => any>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 4: `MaybeElement` target — supports Ref$, Observable<OpaqueObject<Element>>,\n * Document, Window, or an array of those (Legend-State reactive).\n * Raw HTMLElement is excluded — use Ref$ or Observable<OpaqueObject<Element>> instead.\n */\nexport function useEventListener<E extends keyof HTMLElementEventMap>(\n target: MaybeElement | MaybeElement[] | null | undefined,\n event: Arrayable<E>,\n listener: Arrayable<(ev: HTMLElementEventMap[E]) => any>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 5: Observable<EventTarget> — reactive target (e.g.\n * Observable<MediaQueryList>, Ref$<HTMLElement>, etc.).\n * The observer re-fires whenever the observable value changes.\n */\nexport function useEventListener<EventType = Event>(\n target: Observable<any>,\n event: Arrayable<string>,\n listener: Arrayable<GeneralEventListener<EventType>>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n/**\n * Register using addEventListener on mounted, and removeEventListener\n * automatically on unmounted.\n *\n * Overload 6: Generic `EventTarget` fallback.\n */\nexport function useEventListener<EventType = Event>(\n target: EventTarget | null | undefined,\n event: Arrayable<string>,\n listener: Arrayable<GeneralEventListener<EventType>>,\n options?: MaybeObservable<boolean | AddEventListenerOptions>,\n): () => void;\n\n// ---------------------------------------------------------------------------\n// Implementation\n// ---------------------------------------------------------------------------\n\nexport function useEventListener(...args: any[]): () => void {\n // Detect whether first arg is an event name (no target) or a target.\n // Mirrors VueUse's firstParamTargets check.\n const hasTarget = !isEventNameArg(args[0]);\n\n const rawTarget: unknown = hasTarget ? args[0] : undefined;\n const rawEvent: Arrayable<string> = hasTarget ? args[1] : args[0];\n const rawListener: Arrayable<(...a: any[]) => any> = hasTarget\n ? args[2]\n : args[1];\n const rawOptions: MaybeObservable<boolean | AddEventListenerOptions> | undefined = hasTarget\n ? args[3]\n : args[2];\n\n // Always keep the latest listeners in a ref so that the forwarder always\n // calls the current listeners, even after re-renders change the functions.\n const listenersRef = useRef(toArray(rawListener));\n listenersRef.current = toArray(rawListener);\n\n // Stable forwarder — one function reference per hook instance, created once.\n const forwarder = useRef((ev: Event) => {\n listenersRef.current.forEach((l) => l(ev));\n });\n\n // Options ref prevents recreating listeners when only options change.\n const optionsRef = useRef(rawOptions);\n optionsRef.current = rawOptions;\n\n // Observable mount flag — lets useObserve react when component mounts.\n const mounted$ = useObservable(false);\n\n // Array of removeEventListener thunks for the currently active registrations.\n const cleanupsRef = useRef<Array<() => void>>([]);\n\n // Single reactive observer: re-runs whenever mounted$ changes OR any\n // observable target changes. Reading .get() inside this callback registers\n // reactive dependencies, so listener setup/teardown is always in sync.\n useObserve(() => {\n // Teardown previous registrations before re-registering.\n cleanupsRef.current.forEach((fn) => fn());\n cleanupsRef.current = [];\n\n // Only register listeners while the component is mounted.\n if (!mounted$.get()) return;\n\n // Resolve targets inline — reading .get() on observable targets registers\n // them as reactive dependencies for this observer.\n const targets: EventTarget[] = (() => {\n if (!hasTarget) {\n return typeof window !== \"undefined\" ? [window] : [];\n }\n if (rawTarget == null) return [];\n\n const items: unknown[] = Array.isArray(rawTarget)\n ? rawTarget\n : [rawTarget];\n return items.flatMap((item): EventTarget[] => {\n if (item == null) return [];\n // Ref$ references — normalizeTargets handles OpaqueObject.valueOf() unwrapping.\n if (isRef$(item)) {\n return normalizeTargets([item as MaybeElement]) as EventTarget[];\n }\n // Observable targets — .get() unwraps and registers reactive dependency.\n // Supports Element, Document, MediaQueryList, or any EventTarget.\n if (isObservable(item)) {\n const val = (item as { get: () => unknown }).get();\n if (val == null) return [];\n // Unwrap OpaqueObject created by ObservableHint.opaque (has custom valueOf).\n const target =\n typeof (val as any).valueOf === \"function\"\n ? ((val as any).valueOf() as unknown) ?? val\n : val;\n // Duck-type check: works with real EventTargets and test mocks alike.\n if (typeof (target as any).addEventListener === \"function\") {\n return [target as EventTarget];\n }\n return [];\n }\n // Raw EventTarget (Window, Document — stable singletons)\n return [item as EventTarget];\n });\n })();\n\n if (!targets.length) return;\n\n const events = toArray(rawEvent);\n if (!events.length || !listenersRef.current.length) return;\n\n const resolvedOpts = get(optionsRef.current);\n const opts =\n typeof resolvedOpts === \"object\" && resolvedOpts !== null\n ? { ...resolvedOpts }\n : resolvedOpts;\n\n const fn = forwarder.current;\n cleanupsRef.current = targets.flatMap((el) =>\n events.map((event) => {\n el.addEventListener(event, fn, opts);\n return () => el.removeEventListener(event, fn, opts);\n }),\n );\n });\n\n // useEffect manages mount state only — no setup logic here.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n mounted$.set(true);\n return () => {\n mounted$.set(false);\n cleanupsRef.current.forEach((fn) => fn());\n cleanupsRef.current = [];\n };\n }, []);\n\n // Return a manual cleanup function for imperative removal.\n return () => {\n cleanupsRef.current.forEach((fn) => fn());\n cleanupsRef.current = [];\n };\n}\n"],"mappings":"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","names":["fn"]}
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function UseMediaQueryDemo(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { UseMediaQueryDemo as default };
@@ -0,0 +1,5 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ declare function UseMediaQueryDemo(): react_jsx_runtime.JSX.Element;
4
+
5
+ export { UseMediaQueryDemo as default };
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var demo_exports = {};
20
+ __export(demo_exports, {
21
+ default: () => UseMediaQueryDemo
22
+ });
23
+ module.exports = __toCommonJS(demo_exports);
24
+ var import_jsx_runtime = require("react/jsx-runtime");
25
+ var import__ = require(".");
26
+ const row = {
27
+ display: "inline-flex",
28
+ alignItems: "center",
29
+ justifyContent: "start",
30
+ gap: "10px",
31
+ padding: "8px 14px",
32
+ borderRadius: "6px",
33
+ border: "1px solid var(--sl-color-gray-5, #e2e8f0)",
34
+ background: "var(--sl-color-gray-6, #f8fafc)",
35
+ margin: 0
36
+ };
37
+ const label = {
38
+ color: "var(--sl-color-gray-3, #64748b)",
39
+ fontSize: "12px"
40
+ };
41
+ const value = {
42
+ fontFamily: "monospace",
43
+ fontSize: "13px",
44
+ fontWeight: "bold",
45
+ color: "var(--sl-color-text, #0f172a)"
46
+ };
47
+ function UseMediaQueryDemo() {
48
+ const isLargeScreen$ = (0, import__.useMediaQuery)("(min-width: 1024px)");
49
+ const prefersDark$ = (0, import__.useMediaQuery)("(prefers-color-scheme: dark)");
50
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
51
+ "div",
52
+ {
53
+ style: {
54
+ display: "flex",
55
+ flexDirection: "column",
56
+ gap: "8px",
57
+ fontFamily: "monospace",
58
+ fontSize: "13px"
59
+ },
60
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
61
+ "div",
62
+ {
63
+ style: {
64
+ display: "flex",
65
+ gap: "10px"
66
+ },
67
+ children: [
68
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: row, children: [
69
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: label, children: "isLargeScreen" }),
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: value, children: String(isLargeScreen$.get()) })
71
+ ] }),
72
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: row, children: [
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: label, children: "prefersDark" }),
74
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: value, children: String(prefersDark$.get()) })
75
+ ] })
76
+ ]
77
+ }
78
+ )
79
+ }
80
+ );
81
+ }
82
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser/useMediaQuery/demo.tsx"],"sourcesContent":["import { useMediaQuery } from \".\";\n\nconst row: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"start\",\n gap: \"10px\",\n padding: \"8px 14px\",\n borderRadius: \"6px\",\n border: \"1px solid var(--sl-color-gray-5, #e2e8f0)\",\n background: \"var(--sl-color-gray-6, #f8fafc)\",\n margin: 0,\n};\n\nconst label: React.CSSProperties = {\n color: \"var(--sl-color-gray-3, #64748b)\",\n fontSize: \"12px\",\n};\n\nconst value: React.CSSProperties = {\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n fontWeight: \"bold\",\n color: \"var(--sl-color-text, #0f172a)\",\n};\n\nexport default function UseMediaQueryDemo() {\n const isLargeScreen$ = useMediaQuery(\"(min-width: 1024px)\");\n const prefersDark$ = useMediaQuery(\"(prefers-color-scheme: dark)\");\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap: \"10px\",\n }}\n >\n <div style={row}>\n <span style={label}>isLargeScreen</span>\n <span style={value}>{String(isLargeScreen$.get())}</span>\n </div>\n <div style={row}>\n <span style={label}>prefersDark</span>\n <span style={value}>{String(prefersDark$.get())}</span>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AA8CQ;AA9CR,eAA8B;AAE9B,MAAM,MAA2B;AAAA,EAC/B,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,QAAQ;AACV;AAEA,MAAM,QAA6B;AAAA,EACjC,OAAO;AAAA,EACP,UAAU;AACZ;AAEA,MAAM,QAA6B;AAAA,EACjC,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AACT;AAEe,SAAR,oBAAqC;AAC1C,QAAM,qBAAiB,wBAAc,qBAAqB;AAC1D,QAAM,mBAAe,wBAAc,8BAA8B;AAEjE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,KAAK;AAAA,UACP;AAAA,UAEA;AAAA,yDAAC,SAAI,OAAO,KACV;AAAA,0DAAC,UAAK,OAAO,OAAO,2BAAa;AAAA,cACjC,4CAAC,UAAK,OAAO,OAAQ,iBAAO,eAAe,IAAI,CAAC,GAAE;AAAA,eACpD;AAAA,YACA,6CAAC,SAAI,OAAO,KACV;AAAA,0DAAC,UAAK,OAAO,OAAO,yBAAW;AAAA,cAC/B,4CAAC,UAAK,OAAO,OAAQ,iBAAO,aAAa,IAAI,CAAC,GAAE;AAAA,eAClD;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,62 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { useMediaQuery } from ".";
3
+ const row = {
4
+ display: "inline-flex",
5
+ alignItems: "center",
6
+ justifyContent: "start",
7
+ gap: "10px",
8
+ padding: "8px 14px",
9
+ borderRadius: "6px",
10
+ border: "1px solid var(--sl-color-gray-5, #e2e8f0)",
11
+ background: "var(--sl-color-gray-6, #f8fafc)",
12
+ margin: 0
13
+ };
14
+ const label = {
15
+ color: "var(--sl-color-gray-3, #64748b)",
16
+ fontSize: "12px"
17
+ };
18
+ const value = {
19
+ fontFamily: "monospace",
20
+ fontSize: "13px",
21
+ fontWeight: "bold",
22
+ color: "var(--sl-color-text, #0f172a)"
23
+ };
24
+ function UseMediaQueryDemo() {
25
+ const isLargeScreen$ = useMediaQuery("(min-width: 1024px)");
26
+ const prefersDark$ = useMediaQuery("(prefers-color-scheme: dark)");
27
+ return /* @__PURE__ */ jsx(
28
+ "div",
29
+ {
30
+ style: {
31
+ display: "flex",
32
+ flexDirection: "column",
33
+ gap: "8px",
34
+ fontFamily: "monospace",
35
+ fontSize: "13px"
36
+ },
37
+ children: /* @__PURE__ */ jsxs(
38
+ "div",
39
+ {
40
+ style: {
41
+ display: "flex",
42
+ gap: "10px"
43
+ },
44
+ children: [
45
+ /* @__PURE__ */ jsxs("div", { style: row, children: [
46
+ /* @__PURE__ */ jsx("span", { style: label, children: "isLargeScreen" }),
47
+ /* @__PURE__ */ jsx("span", { style: value, children: String(isLargeScreen$.get()) })
48
+ ] }),
49
+ /* @__PURE__ */ jsxs("div", { style: row, children: [
50
+ /* @__PURE__ */ jsx("span", { style: label, children: "prefersDark" }),
51
+ /* @__PURE__ */ jsx("span", { style: value, children: String(prefersDark$.get()) })
52
+ ] })
53
+ ]
54
+ }
55
+ )
56
+ }
57
+ );
58
+ }
59
+ export {
60
+ UseMediaQueryDemo as default
61
+ };
62
+ //# sourceMappingURL=demo.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/browser/useMediaQuery/demo.tsx"],"sourcesContent":["import { useMediaQuery } from \".\";\n\nconst row: React.CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"start\",\n gap: \"10px\",\n padding: \"8px 14px\",\n borderRadius: \"6px\",\n border: \"1px solid var(--sl-color-gray-5, #e2e8f0)\",\n background: \"var(--sl-color-gray-6, #f8fafc)\",\n margin: 0,\n};\n\nconst label: React.CSSProperties = {\n color: \"var(--sl-color-gray-3, #64748b)\",\n fontSize: \"12px\",\n};\n\nconst value: React.CSSProperties = {\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n fontWeight: \"bold\",\n color: \"var(--sl-color-text, #0f172a)\",\n};\n\nexport default function UseMediaQueryDemo() {\n const isLargeScreen$ = useMediaQuery(\"(min-width: 1024px)\");\n const prefersDark$ = useMediaQuery(\"(prefers-color-scheme: dark)\");\n\n return (\n <div\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"8px\",\n fontFamily: \"monospace\",\n fontSize: \"13px\",\n }}\n >\n <div\n style={{\n display: \"flex\",\n gap: \"10px\",\n }}\n >\n <div style={row}>\n <span style={label}>isLargeScreen</span>\n <span style={value}>{String(isLargeScreen$.get())}</span>\n </div>\n <div style={row}>\n <span style={label}>prefersDark</span>\n <span style={value}>{String(prefersDark$.get())}</span>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"AA8CQ,SACE,KADF;AA9CR,SAAS,qBAAqB;AAE9B,MAAM,MAA2B;AAAA,EAC/B,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,KAAK;AAAA,EACL,SAAS;AAAA,EACT,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,QAAQ;AACV;AAEA,MAAM,QAA6B;AAAA,EACjC,OAAO;AAAA,EACP,UAAU;AACZ;AAEA,MAAM,QAA6B;AAAA,EACjC,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AACT;AAEe,SAAR,oBAAqC;AAC1C,QAAM,iBAAiB,cAAc,qBAAqB;AAC1D,QAAM,eAAe,cAAc,8BAA8B;AAEjE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO;AAAA,QACL,SAAS;AAAA,QACT,eAAe;AAAA,QACf,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,UAAU;AAAA,MACZ;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,SAAS;AAAA,YACT,KAAK;AAAA,UACP;AAAA,UAEA;AAAA,iCAAC,SAAI,OAAO,KACV;AAAA,kCAAC,UAAK,OAAO,OAAO,2BAAa;AAAA,cACjC,oBAAC,UAAK,OAAO,OAAQ,iBAAO,eAAe,IAAI,CAAC,GAAE;AAAA,eACpD;AAAA,YACA,qBAAC,SAAI,OAAO,KACV;AAAA,kCAAC,UAAK,OAAO,OAAO,yBAAW;AAAA,cAC/B,oBAAC,UAAK,OAAO,OAAQ,iBAAO,aAAa,IAAI,CAAC,GAAE;AAAA,eAClD;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -0,0 +1,11 @@
1
+ import { Observable } from '@legendapp/state';
2
+ import { MaybeObservable } from '../../types.mjs';
3
+
4
+ declare function evaluateSSRQuery(query: string, ssrWidth: number): boolean;
5
+ interface UseMediaQueryOptions {
6
+ ssrWidth?: number;
7
+ }
8
+ type UseMediaQueryReturn = Observable<boolean>;
9
+ declare function useMediaQuery(query: MaybeObservable<string>, options?: UseMediaQueryOptions): UseMediaQueryReturn;
10
+
11
+ export { type UseMediaQueryOptions, type UseMediaQueryReturn, evaluateSSRQuery, useMediaQuery };
@@ -0,0 +1,11 @@
1
+ import { Observable } from '@legendapp/state';
2
+ import { MaybeObservable } from '../../types.js';
3
+
4
+ declare function evaluateSSRQuery(query: string, ssrWidth: number): boolean;
5
+ interface UseMediaQueryOptions {
6
+ ssrWidth?: number;
7
+ }
8
+ type UseMediaQueryReturn = Observable<boolean>;
9
+ declare function useMediaQuery(query: MaybeObservable<string>, options?: UseMediaQueryOptions): UseMediaQueryReturn;
10
+
11
+ export { type UseMediaQueryOptions, type UseMediaQueryReturn, evaluateSSRQuery, useMediaQuery };