@usels/core 0.0.1
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.
- package/README.md +21 -0
- package/dist/browser/useEventListener/index.d.mts +56 -0
- package/dist/browser/useEventListener/index.d.ts +56 -0
- package/dist/browser/useEventListener/index.js +112 -0
- package/dist/browser/useEventListener/index.js.map +1 -0
- package/dist/browser/useEventListener/index.mjs +88 -0
- package/dist/browser/useEventListener/index.mjs.map +1 -0
- package/dist/browser/useMediaQuery/demo.d.mts +5 -0
- package/dist/browser/useMediaQuery/demo.d.ts +5 -0
- package/dist/browser/useMediaQuery/demo.js +83 -0
- package/dist/browser/useMediaQuery/demo.js.map +1 -0
- package/dist/browser/useMediaQuery/demo.mjs +63 -0
- package/dist/browser/useMediaQuery/demo.mjs.map +1 -0
- package/dist/browser/useMediaQuery/index.d.mts +11 -0
- package/dist/browser/useMediaQuery/index.d.ts +11 -0
- package/dist/browser/useMediaQuery/index.js +89 -0
- package/dist/browser/useMediaQuery/index.js.map +1 -0
- package/dist/browser/useMediaQuery/index.mjs +64 -0
- package/dist/browser/useMediaQuery/index.mjs.map +1 -0
- package/dist/components/Auto/index.d.mts +33 -0
- package/dist/components/Auto/index.d.ts +33 -0
- package/dist/components/Auto/index.js +66 -0
- package/dist/components/Auto/index.js.map +1 -0
- package/dist/components/Auto/index.mjs +34 -0
- package/dist/components/Auto/index.mjs.map +1 -0
- package/dist/elements/useDocumentVisibility/demo.d.mts +5 -0
- package/dist/elements/useDocumentVisibility/demo.d.ts +5 -0
- package/dist/elements/useDocumentVisibility/demo.js +130 -0
- package/dist/elements/useDocumentVisibility/demo.js.map +1 -0
- package/dist/elements/useDocumentVisibility/demo.mjs +114 -0
- package/dist/elements/useDocumentVisibility/demo.mjs.map +1 -0
- package/dist/elements/useDocumentVisibility/index.d.mts +5 -0
- package/dist/elements/useDocumentVisibility/index.d.ts +5 -0
- package/dist/elements/useDocumentVisibility/index.js +45 -0
- package/dist/elements/useDocumentVisibility/index.js.map +1 -0
- package/dist/elements/useDocumentVisibility/index.mjs +21 -0
- package/dist/elements/useDocumentVisibility/index.mjs.map +1 -0
- package/dist/elements/useElementBounding/demo.d.mts +5 -0
- package/dist/elements/useElementBounding/demo.d.ts +5 -0
- package/dist/elements/useElementBounding/demo.js +87 -0
- package/dist/elements/useElementBounding/demo.js.map +1 -0
- package/dist/elements/useElementBounding/demo.mjs +67 -0
- package/dist/elements/useElementBounding/demo.mjs.map +1 -0
- package/dist/elements/useElementBounding/index.d.mts +46 -0
- package/dist/elements/useElementBounding/index.d.ts +46 -0
- package/dist/elements/useElementBounding/index.js +122 -0
- package/dist/elements/useElementBounding/index.js.map +1 -0
- package/dist/elements/useElementBounding/index.mjs +98 -0
- package/dist/elements/useElementBounding/index.mjs.map +1 -0
- package/dist/elements/useElementSize/demo.d.mts +5 -0
- package/dist/elements/useElementSize/demo.d.ts +5 -0
- package/dist/elements/useElementSize/demo.js +83 -0
- package/dist/elements/useElementSize/demo.js.map +1 -0
- package/dist/elements/useElementSize/demo.mjs +63 -0
- package/dist/elements/useElementSize/demo.mjs.map +1 -0
- package/dist/elements/useElementSize/index.d.mts +34 -0
- package/dist/elements/useElementSize/index.d.ts +34 -0
- package/dist/elements/useElementSize/index.js +85 -0
- package/dist/elements/useElementSize/index.js.map +1 -0
- package/dist/elements/useElementSize/index.mjs +61 -0
- package/dist/elements/useElementSize/index.mjs.map +1 -0
- package/dist/elements/useElementVisibility/demo.d.mts +5 -0
- package/dist/elements/useElementVisibility/demo.d.ts +5 -0
- package/dist/elements/useElementVisibility/demo.js +110 -0
- package/dist/elements/useElementVisibility/demo.js.map +1 -0
- package/dist/elements/useElementVisibility/demo.mjs +90 -0
- package/dist/elements/useElementVisibility/demo.mjs.map +1 -0
- package/dist/elements/useElementVisibility/index.d.mts +43 -0
- package/dist/elements/useElementVisibility/index.d.ts +43 -0
- package/dist/elements/useElementVisibility/index.js +58 -0
- package/dist/elements/useElementVisibility/index.js.map +1 -0
- package/dist/elements/useElementVisibility/index.mjs +34 -0
- package/dist/elements/useElementVisibility/index.mjs.map +1 -0
- package/dist/elements/useIntersectionObserver/demo.d.mts +5 -0
- package/dist/elements/useIntersectionObserver/demo.d.ts +5 -0
- package/dist/elements/useIntersectionObserver/demo.js +173 -0
- package/dist/elements/useIntersectionObserver/demo.js.map +1 -0
- package/dist/elements/useIntersectionObserver/demo.mjs +153 -0
- package/dist/elements/useIntersectionObserver/demo.mjs.map +1 -0
- package/dist/elements/useIntersectionObserver/index.d.mts +47 -0
- package/dist/elements/useIntersectionObserver/index.d.ts +47 -0
- package/dist/elements/useIntersectionObserver/index.js +111 -0
- package/dist/elements/useIntersectionObserver/index.js.map +1 -0
- package/dist/elements/useIntersectionObserver/index.mjs +87 -0
- package/dist/elements/useIntersectionObserver/index.mjs.map +1 -0
- package/dist/elements/useMouseInElement/demo.d.mts +5 -0
- package/dist/elements/useMouseInElement/demo.d.ts +5 -0
- package/dist/elements/useMouseInElement/demo.js +104 -0
- package/dist/elements/useMouseInElement/demo.js.map +1 -0
- package/dist/elements/useMouseInElement/demo.mjs +84 -0
- package/dist/elements/useMouseInElement/demo.mjs.map +1 -0
- package/dist/elements/useMouseInElement/index.d.mts +56 -0
- package/dist/elements/useMouseInElement/index.d.ts +56 -0
- package/dist/elements/useMouseInElement/index.js +148 -0
- package/dist/elements/useMouseInElement/index.js.map +1 -0
- package/dist/elements/useMouseInElement/index.mjs +124 -0
- package/dist/elements/useMouseInElement/index.mjs.map +1 -0
- package/dist/elements/useMutationObserver/demo.d.mts +5 -0
- package/dist/elements/useMutationObserver/demo.d.ts +5 -0
- package/dist/elements/useMutationObserver/demo.js +240 -0
- package/dist/elements/useMutationObserver/demo.js.map +1 -0
- package/dist/elements/useMutationObserver/demo.mjs +220 -0
- package/dist/elements/useMutationObserver/demo.mjs.map +1 -0
- package/dist/elements/useMutationObserver/index.d.mts +15 -0
- package/dist/elements/useMutationObserver/index.d.ts +15 -0
- package/dist/elements/useMutationObserver/index.js +69 -0
- package/dist/elements/useMutationObserver/index.js.map +1 -0
- package/dist/elements/useMutationObserver/index.mjs +45 -0
- package/dist/elements/useMutationObserver/index.mjs.map +1 -0
- package/dist/elements/useParentElement/demo.d.mts +5 -0
- package/dist/elements/useParentElement/demo.d.ts +5 -0
- package/dist/elements/useParentElement/demo.js +132 -0
- package/dist/elements/useParentElement/demo.js.map +1 -0
- package/dist/elements/useParentElement/demo.mjs +112 -0
- package/dist/elements/useParentElement/demo.mjs.map +1 -0
- package/dist/elements/useParentElement/index.d.mts +7 -0
- package/dist/elements/useParentElement/index.d.ts +7 -0
- package/dist/elements/useParentElement/index.js +47 -0
- package/dist/elements/useParentElement/index.js.map +1 -0
- package/dist/elements/useParentElement/index.mjs +23 -0
- package/dist/elements/useParentElement/index.mjs.map +1 -0
- package/dist/elements/useRef$/index.js +89 -0
- package/dist/elements/useRef$/index.js.map +1 -0
- package/dist/elements/useRef$/index.mjs +62 -0
- package/dist/elements/useRef$/index.mjs.map +1 -0
- package/dist/elements/useRef_/index.d.mts +60 -0
- package/dist/elements/useRef_/index.d.ts +60 -0
- package/dist/elements/useResizeObserver/demo.d.mts +5 -0
- package/dist/elements/useResizeObserver/demo.d.ts +5 -0
- package/dist/elements/useResizeObserver/demo.js +90 -0
- package/dist/elements/useResizeObserver/demo.js.map +1 -0
- package/dist/elements/useResizeObserver/demo.mjs +70 -0
- package/dist/elements/useResizeObserver/demo.mjs.map +1 -0
- package/dist/elements/useResizeObserver/index.d.mts +36 -0
- package/dist/elements/useResizeObserver/index.d.ts +36 -0
- package/dist/elements/useResizeObserver/index.js +74 -0
- package/dist/elements/useResizeObserver/index.js.map +1 -0
- package/dist/elements/useResizeObserver/index.mjs +49 -0
- package/dist/elements/useResizeObserver/index.mjs.map +1 -0
- package/dist/elements/useWindowFocus/demo.d.mts +5 -0
- package/dist/elements/useWindowFocus/demo.d.ts +5 -0
- package/dist/elements/useWindowFocus/demo.js +104 -0
- package/dist/elements/useWindowFocus/demo.js.map +1 -0
- package/dist/elements/useWindowFocus/demo.mjs +84 -0
- package/dist/elements/useWindowFocus/demo.mjs.map +1 -0
- package/dist/elements/useWindowFocus/index.d.mts +5 -0
- package/dist/elements/useWindowFocus/index.d.ts +5 -0
- package/dist/elements/useWindowFocus/index.js +42 -0
- package/dist/elements/useWindowFocus/index.js.map +1 -0
- package/dist/elements/useWindowFocus/index.mjs +18 -0
- package/dist/elements/useWindowFocus/index.mjs.map +1 -0
- package/dist/elements/useWindowSize/demo.d.mts +5 -0
- package/dist/elements/useWindowSize/demo.d.ts +5 -0
- package/dist/elements/useWindowSize/demo.js +79 -0
- package/dist/elements/useWindowSize/demo.js.map +1 -0
- package/dist/elements/useWindowSize/demo.mjs +59 -0
- package/dist/elements/useWindowSize/demo.mjs.map +1 -0
- package/dist/elements/useWindowSize/index.d.mts +17 -0
- package/dist/elements/useWindowSize/index.d.ts +17 -0
- package/dist/elements/useWindowSize/index.js +96 -0
- package/dist/elements/useWindowSize/index.js.map +1 -0
- package/dist/elements/useWindowSize/index.mjs +76 -0
- package/dist/elements/useWindowSize/index.mjs.map +1 -0
- package/dist/function/get/index.d.mts +45 -0
- package/dist/function/get/index.d.ts +45 -0
- package/dist/function/get/index.js +39 -0
- package/dist/function/get/index.js.map +1 -0
- package/dist/function/get/index.mjs +15 -0
- package/dist/function/get/index.mjs.map +1 -0
- package/dist/function/peek/index.d.mts +46 -0
- package/dist/function/peek/index.d.ts +46 -0
- package/dist/function/peek/index.js +39 -0
- package/dist/function/peek/index.js.map +1 -0
- package/dist/function/peek/index.mjs +15 -0
- package/dist/function/peek/index.mjs.map +1 -0
- package/dist/function/useMayObservableOptions/index.d.mts +59 -0
- package/dist/function/useMayObservableOptions/index.d.ts +59 -0
- package/dist/function/useMayObservableOptions/index.js +109 -0
- package/dist/function/useMayObservableOptions/index.js.map +1 -0
- package/dist/function/useMayObservableOptions/index.mjs +88 -0
- package/dist/function/useMayObservableOptions/index.mjs.map +1 -0
- package/dist/function/useSupported/index.d.mts +6 -0
- package/dist/function/useSupported/index.d.ts +6 -0
- package/dist/function/useSupported/index.js +37 -0
- package/dist/function/useSupported/index.js.map +1 -0
- package/dist/function/useSupported/index.mjs +13 -0
- package/dist/function/useSupported/index.mjs.map +1 -0
- package/dist/function/useWhenMounted/index.d.mts +6 -0
- package/dist/function/useWhenMounted/index.d.ts +6 -0
- package/dist/function/useWhenMounted/index.js +37 -0
- package/dist/function/useWhenMounted/index.js.map +1 -0
- package/dist/function/useWhenMounted/index.mjs +13 -0
- package/dist/function/useWhenMounted/index.mjs.map +1 -0
- package/dist/index.d.mts +24 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +22 -0
- package/dist/index.mjs.map +1 -0
- package/dist/sensors/useScroll/demo.d.mts +5 -0
- package/dist/sensors/useScroll/demo.d.ts +5 -0
- package/dist/sensors/useScroll/demo.js +122 -0
- package/dist/sensors/useScroll/demo.js.map +1 -0
- package/dist/sensors/useScroll/demo.mjs +102 -0
- package/dist/sensors/useScroll/demo.mjs.map +1 -0
- package/dist/sensors/useScroll/index.d.mts +42 -0
- package/dist/sensors/useScroll/index.d.ts +42 -0
- package/dist/sensors/useScroll/index.js +149 -0
- package/dist/sensors/useScroll/index.js.map +1 -0
- package/dist/sensors/useScroll/index.mjs +125 -0
- package/dist/sensors/useScroll/index.mjs.map +1 -0
- package/dist/sensors/useWindowScroll/demo.d.mts +5 -0
- package/dist/sensors/useWindowScroll/demo.d.ts +5 -0
- package/dist/sensors/useWindowScroll/demo.js +85 -0
- package/dist/sensors/useWindowScroll/demo.js.map +1 -0
- package/dist/sensors/useWindowScroll/demo.mjs +65 -0
- package/dist/sensors/useWindowScroll/demo.mjs.map +1 -0
- package/dist/sensors/useWindowScroll/index.d.mts +9 -0
- package/dist/sensors/useWindowScroll/index.d.ts +9 -0
- package/dist/sensors/useWindowScroll/index.js +36 -0
- package/dist/sensors/useWindowScroll/index.js.map +1 -0
- package/dist/sensors/useWindowScroll/index.mjs +12 -0
- package/dist/sensors/useWindowScroll/index.mjs.map +1 -0
- package/dist/shared/configurable.d.mts +21 -0
- package/dist/shared/configurable.d.ts +21 -0
- package/dist/shared/configurable.js +39 -0
- package/dist/shared/configurable.js.map +1 -0
- package/dist/shared/configurable.mjs +12 -0
- package/dist/shared/configurable.mjs.map +1 -0
- package/dist/shared/index.d.mts +4 -0
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared/index.js +31 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/index.mjs +7 -0
- package/dist/shared/index.mjs.map +1 -0
- package/dist/shared/normalizeTargets/index.d.mts +21 -0
- package/dist/shared/normalizeTargets/index.d.ts +21 -0
- package/dist/shared/normalizeTargets/index.js +36 -0
- package/dist/shared/normalizeTargets/index.js.map +1 -0
- package/dist/shared/normalizeTargets/index.mjs +12 -0
- package/dist/shared/normalizeTargets/index.mjs.map +1 -0
- package/dist/shared/utils.d.mts +15 -0
- package/dist/shared/utils.d.ts +15 -0
- package/dist/shared/utils.js +87 -0
- package/dist/shared/utils.js.map +1 -0
- package/dist/shared/utils.mjs +52 -0
- package/dist/shared/utils.mjs.map +1 -0
- package/dist/types.d.mts +52 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +1 -0
- package/dist/types.mjs.map +1 -0
- package/package.json +54 -0
- package/src/browser/useEventListener/index.md +109 -0
- package/src/browser/useEventListener/index.spec.ts +611 -0
- package/src/browser/useEventListener/index.ts +242 -0
- package/src/browser/useMediaQuery/demo.tsx +63 -0
- package/src/browser/useMediaQuery/index.md +43 -0
- package/src/browser/useMediaQuery/index.spec.ts +267 -0
- package/src/browser/useMediaQuery/index.ts +96 -0
- package/src/components/Auto/index.tsx +65 -0
- package/src/elements/useDocumentVisibility/demo.tsx +111 -0
- package/src/elements/useDocumentVisibility/index.md +54 -0
- package/src/elements/useDocumentVisibility/index.spec.ts +114 -0
- package/src/elements/useDocumentVisibility/index.ts +26 -0
- package/src/elements/useElementBounding/demo.tsx +68 -0
- package/src/elements/useElementBounding/index.md +64 -0
- package/src/elements/useElementBounding/index.ts +159 -0
- package/src/elements/useElementSize/demo.tsx +53 -0
- package/src/elements/useElementSize/index.md +65 -0
- package/src/elements/useElementSize/index.spec.ts +295 -0
- package/src/elements/useElementSize/index.ts +100 -0
- package/src/elements/useElementVisibility/deep-observable-pattern.spec.ts +453 -0
- package/src/elements/useElementVisibility/demo.tsx +97 -0
- package/src/elements/useElementVisibility/index.md +98 -0
- package/src/elements/useElementVisibility/index.spec.ts +227 -0
- package/src/elements/useElementVisibility/index.ts +78 -0
- package/src/elements/useIntersectionObserver/demo.tsx +180 -0
- package/src/elements/useIntersectionObserver/index.md +99 -0
- package/src/elements/useIntersectionObserver/index.spec.ts +482 -0
- package/src/elements/useIntersectionObserver/index.ts +149 -0
- package/src/elements/useMouseInElement/demo.tsx +88 -0
- package/src/elements/useMouseInElement/index.md +76 -0
- package/src/elements/useMouseInElement/index.spec.ts +398 -0
- package/src/elements/useMouseInElement/index.ts +209 -0
- package/src/elements/useMutationObserver/demo.tsx +270 -0
- package/src/elements/useMutationObserver/index.md +99 -0
- package/src/elements/useMutationObserver/index.spec.ts +421 -0
- package/src/elements/useMutationObserver/index.ts +66 -0
- package/src/elements/useParentElement/demo.tsx +120 -0
- package/src/elements/useParentElement/index.md +67 -0
- package/src/elements/useParentElement/index.spec.ts +208 -0
- package/src/elements/useParentElement/index.ts +35 -0
- package/src/elements/useRef$/index.md +62 -0
- package/src/elements/useRef$/index.spec.ts +205 -0
- package/src/elements/useRef$/index.ts +137 -0
- package/src/elements/useRef$/useImperativeHandle.spec.ts +339 -0
- package/src/elements/useResizeObserver/demo.tsx +62 -0
- package/src/elements/useResizeObserver/index.md +51 -0
- package/src/elements/useResizeObserver/index.spec.ts +312 -0
- package/src/elements/useResizeObserver/index.ts +106 -0
- package/src/elements/useWindowFocus/demo.tsx +79 -0
- package/src/elements/useWindowFocus/index.md +38 -0
- package/src/elements/useWindowFocus/index.spec.ts +103 -0
- package/src/elements/useWindowFocus/index.ts +21 -0
- package/src/elements/useWindowSize/demo.tsx +51 -0
- package/src/elements/useWindowSize/index.md +55 -0
- package/src/elements/useWindowSize/index.spec.ts +310 -0
- package/src/elements/useWindowSize/index.ts +107 -0
- package/src/function/get/index.md +25 -0
- package/src/function/get/index.spec.ts +87 -0
- package/src/function/get/index.ts +70 -0
- package/src/function/peek/index.spec.ts +97 -0
- package/src/function/peek/index.ts +69 -0
- package/src/function/useMayObservableOptions/index.spec.ts +521 -0
- package/src/function/useMayObservableOptions/index.ts +173 -0
- package/src/function/useSupported/index.md +43 -0
- package/src/function/useSupported/index.spec.ts +116 -0
- package/src/function/useSupported/index.ts +14 -0
- package/src/function/useWhenMounted/index.md +25 -0
- package/src/function/useWhenMounted/index.spec.ts +120 -0
- package/src/function/useWhenMounted/index.ts +16 -0
- package/src/index.ts +25 -0
- package/src/sensors/useScroll/demo.tsx +103 -0
- package/src/sensors/useScroll/index.md +117 -0
- package/src/sensors/useScroll/index.spec.ts +678 -0
- package/src/sensors/useScroll/index.ts +201 -0
- package/src/sensors/useWindowScroll/demo.tsx +78 -0
- package/src/sensors/useWindowScroll/index.md +98 -0
- package/src/sensors/useWindowScroll/index.spec.ts +69 -0
- package/src/sensors/useWindowScroll/index.ts +11 -0
- package/src/shared/configurable.ts +35 -0
- package/src/shared/index.ts +4 -0
- package/src/shared/normalizeTargets/index.spec.ts +76 -0
- package/src/shared/normalizeTargets/index.ts +27 -0
- package/src/shared/utils.ts +67 -0
- package/src/types.ts +56 -0
- package/tsconfig.json +9 -0
- package/tsup.config.ts +10 -0
- 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,83 @@
|
|
|
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
|
+
var import_react = require("@legendapp/state/react");
|
|
27
|
+
const row = {
|
|
28
|
+
display: "inline-flex",
|
|
29
|
+
alignItems: "center",
|
|
30
|
+
justifyContent: "start",
|
|
31
|
+
gap: "10px",
|
|
32
|
+
padding: "8px 14px",
|
|
33
|
+
borderRadius: "6px",
|
|
34
|
+
border: "1px solid var(--sl-color-gray-5, #e2e8f0)",
|
|
35
|
+
background: "var(--sl-color-gray-6, #f8fafc)",
|
|
36
|
+
margin: 0
|
|
37
|
+
};
|
|
38
|
+
const label = {
|
|
39
|
+
color: "var(--sl-color-gray-3, #64748b)",
|
|
40
|
+
fontSize: "12px"
|
|
41
|
+
};
|
|
42
|
+
const value = {
|
|
43
|
+
fontFamily: "monospace",
|
|
44
|
+
fontSize: "13px",
|
|
45
|
+
fontWeight: "bold",
|
|
46
|
+
color: "var(--sl-color-text, #0f172a)"
|
|
47
|
+
};
|
|
48
|
+
function UseMediaQueryDemo() {
|
|
49
|
+
const isLargeScreen$ = (0, import__.useMediaQuery)("(min-width: 1024px)");
|
|
50
|
+
const prefersDark$ = (0, import__.useMediaQuery)("(prefers-color-scheme: dark)");
|
|
51
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
52
|
+
"div",
|
|
53
|
+
{
|
|
54
|
+
style: {
|
|
55
|
+
display: "flex",
|
|
56
|
+
flexDirection: "column",
|
|
57
|
+
gap: "8px",
|
|
58
|
+
fontFamily: "monospace",
|
|
59
|
+
fontSize: "13px"
|
|
60
|
+
},
|
|
61
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_react.Computed, { children: () => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
62
|
+
"div",
|
|
63
|
+
{
|
|
64
|
+
style: {
|
|
65
|
+
display: "flex",
|
|
66
|
+
gap: "10px"
|
|
67
|
+
},
|
|
68
|
+
children: [
|
|
69
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: row, children: [
|
|
70
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: label, children: "isLargeScreen" }),
|
|
71
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: value, children: String(isLargeScreen$.get()) })
|
|
72
|
+
] }),
|
|
73
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { style: row, children: [
|
|
74
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: label, children: "prefersDark" }),
|
|
75
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: value, children: String(prefersDark$.get()) })
|
|
76
|
+
] })
|
|
77
|
+
]
|
|
78
|
+
}
|
|
79
|
+
) })
|
|
80
|
+
}
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=demo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/browser/useMediaQuery/demo.tsx"],"sourcesContent":["import { useMediaQuery } from \".\";\nimport { Computed } from \"@legendapp/state/react\";\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 <Computed>\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 )}\n </Computed>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDY;AAjDZ,eAA8B;AAC9B,mBAAyB;AAEzB,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,sDAAC,yBACE,gBACC;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,GAEJ;AAAA;AAAA,EACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMediaQuery } from ".";
|
|
3
|
+
import { Computed } from "@legendapp/state/react";
|
|
4
|
+
const row = {
|
|
5
|
+
display: "inline-flex",
|
|
6
|
+
alignItems: "center",
|
|
7
|
+
justifyContent: "start",
|
|
8
|
+
gap: "10px",
|
|
9
|
+
padding: "8px 14px",
|
|
10
|
+
borderRadius: "6px",
|
|
11
|
+
border: "1px solid var(--sl-color-gray-5, #e2e8f0)",
|
|
12
|
+
background: "var(--sl-color-gray-6, #f8fafc)",
|
|
13
|
+
margin: 0
|
|
14
|
+
};
|
|
15
|
+
const label = {
|
|
16
|
+
color: "var(--sl-color-gray-3, #64748b)",
|
|
17
|
+
fontSize: "12px"
|
|
18
|
+
};
|
|
19
|
+
const value = {
|
|
20
|
+
fontFamily: "monospace",
|
|
21
|
+
fontSize: "13px",
|
|
22
|
+
fontWeight: "bold",
|
|
23
|
+
color: "var(--sl-color-text, #0f172a)"
|
|
24
|
+
};
|
|
25
|
+
function UseMediaQueryDemo() {
|
|
26
|
+
const isLargeScreen$ = useMediaQuery("(min-width: 1024px)");
|
|
27
|
+
const prefersDark$ = useMediaQuery("(prefers-color-scheme: dark)");
|
|
28
|
+
return /* @__PURE__ */ jsx(
|
|
29
|
+
"div",
|
|
30
|
+
{
|
|
31
|
+
style: {
|
|
32
|
+
display: "flex",
|
|
33
|
+
flexDirection: "column",
|
|
34
|
+
gap: "8px",
|
|
35
|
+
fontFamily: "monospace",
|
|
36
|
+
fontSize: "13px"
|
|
37
|
+
},
|
|
38
|
+
children: /* @__PURE__ */ jsx(Computed, { children: () => /* @__PURE__ */ jsxs(
|
|
39
|
+
"div",
|
|
40
|
+
{
|
|
41
|
+
style: {
|
|
42
|
+
display: "flex",
|
|
43
|
+
gap: "10px"
|
|
44
|
+
},
|
|
45
|
+
children: [
|
|
46
|
+
/* @__PURE__ */ jsxs("div", { style: row, children: [
|
|
47
|
+
/* @__PURE__ */ jsx("span", { style: label, children: "isLargeScreen" }),
|
|
48
|
+
/* @__PURE__ */ jsx("span", { style: value, children: String(isLargeScreen$.get()) })
|
|
49
|
+
] }),
|
|
50
|
+
/* @__PURE__ */ jsxs("div", { style: row, children: [
|
|
51
|
+
/* @__PURE__ */ jsx("span", { style: label, children: "prefersDark" }),
|
|
52
|
+
/* @__PURE__ */ jsx("span", { style: value, children: String(prefersDark$.get()) })
|
|
53
|
+
] })
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
) })
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
UseMediaQueryDemo as default
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=demo.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/browser/useMediaQuery/demo.tsx"],"sourcesContent":["import { useMediaQuery } from \".\";\nimport { Computed } from \"@legendapp/state/react\";\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 <Computed>\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 )}\n </Computed>\n </div>\n );\n}\n"],"mappings":"AAiDY,SACE,KADF;AAjDZ,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AAEzB,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,8BAAC,YACE,gBACC;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,GAEJ;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 };
|