katanakit-js 2.2.1 → 2.12.9
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 +72 -437
- package/dist/adapters/astro/astro.service.d.ts +103 -15
- package/dist/adapters/astro/astro.service.d.ts.map +1 -1
- package/dist/adapters/astro/astro.service.js +145 -75
- package/dist/adapters/astro/astro.service.js.map +1 -1
- package/dist/adapters/astro/index.d.ts +1 -1
- package/dist/adapters/astro/index.d.ts.map +1 -1
- package/dist/adapters/astro/index.js +1 -1
- package/dist/adapters/astro/index.js.map +1 -1
- package/dist/adapters/astro/rss.service.d.ts +85 -105
- package/dist/adapters/astro/rss.service.d.ts.map +1 -1
- package/dist/adapters/astro/rss.service.js +172 -168
- package/dist/adapters/astro/rss.service.js.map +1 -1
- package/dist/adapters/astro/seo.service.d.ts +10 -0
- package/dist/adapters/astro/seo.service.d.ts.map +1 -0
- package/dist/adapters/astro/seo.service.js +3 -0
- package/dist/adapters/astro/seo.service.js.map +1 -0
- package/dist/adapters/express/app.d.ts +30 -1
- package/dist/adapters/express/app.d.ts.map +1 -1
- package/dist/adapters/express/app.js +31 -3
- package/dist/adapters/express/app.js.map +1 -1
- package/dist/adapters/express/index.d.ts +2 -2
- package/dist/adapters/express/index.d.ts.map +1 -1
- package/dist/adapters/express/index.js +2 -2
- package/dist/adapters/express/index.js.map +1 -1
- package/dist/adapters/express/main.js +2 -2
- package/dist/adapters/express/main.js.map +1 -1
- package/dist/adapters/express/products.controller.d.ts +67 -8
- package/dist/adapters/express/products.controller.d.ts.map +1 -1
- package/dist/adapters/express/products.controller.js +105 -49
- package/dist/adapters/express/products.controller.js.map +1 -1
- package/dist/adapters/express/server.d.ts +37 -13
- package/dist/adapters/express/server.d.ts.map +1 -1
- package/dist/adapters/express/server.js +118 -53
- package/dist/adapters/express/server.js.map +1 -1
- package/dist/adapters/nuxt/nuxt.service.d.ts +8 -6
- package/dist/adapters/nuxt/nuxt.service.d.ts.map +1 -1
- package/dist/adapters/nuxt/nuxt.service.js +34 -10
- package/dist/adapters/nuxt/nuxt.service.js.map +1 -1
- package/dist/adapters/vue/vue.service.d.ts +5 -2
- package/dist/adapters/vue/vue.service.d.ts.map +1 -1
- package/dist/adapters/vue/vue.service.js +41 -7
- package/dist/adapters/vue/vue.service.js.map +1 -1
- package/dist/config/index.d.ts +2 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/seo-meta.types.d.ts +177 -0
- package/dist/config/seo-meta.types.d.ts.map +1 -0
- package/dist/config/seo-meta.types.js +11 -0
- package/dist/config/seo-meta.types.js.map +1 -0
- package/dist/config/seo.service.d.ts +41 -58
- package/dist/config/seo.service.d.ts.map +1 -1
- package/dist/config/seo.service.js +468 -136
- package/dist/config/seo.service.js.map +1 -1
- package/dist/config/site.config.d.ts +10 -50
- package/dist/config/site.config.d.ts.map +1 -1
- package/dist/config/site.config.js +8 -36
- package/dist/config/site.config.js.map +1 -1
- package/dist/core/index.d.ts +1 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -3
- package/dist/core/index.js.map +1 -1
- package/dist/core/services/dates.service.d.ts +149 -22
- package/dist/core/services/dates.service.d.ts.map +1 -1
- package/dist/core/services/dates.service.js +201 -54
- package/dist/core/services/dates.service.js.map +1 -1
- package/dist/core/services/error.service.d.ts +32 -20
- package/dist/core/services/error.service.d.ts.map +1 -1
- package/dist/core/services/error.service.js +44 -32
- package/dist/core/services/error.service.js.map +1 -1
- package/dist/core/services/formatter.service.d.ts +245 -35
- package/dist/core/services/formatter.service.d.ts.map +1 -1
- package/dist/core/services/formatter.service.js +281 -57
- package/dist/core/services/formatter.service.js.map +1 -1
- package/dist/core/services/generator.service.d.ts +115 -26
- package/dist/core/services/generator.service.d.ts.map +1 -1
- package/dist/core/services/generator.service.js +191 -56
- package/dist/core/services/generator.service.js.map +1 -1
- package/dist/core/services/geometry.service.d.ts +369 -39
- package/dist/core/services/geometry.service.d.ts.map +1 -1
- package/dist/core/services/geometry.service.js +424 -66
- package/dist/core/services/geometry.service.js.map +1 -1
- package/dist/core/services/http.service.d.ts +244 -21
- package/dist/core/services/http.service.d.ts.map +1 -1
- package/dist/core/services/http.service.js +419 -98
- package/dist/core/services/http.service.js.map +1 -1
- package/dist/core/services/logger.service.d.ts +95 -29
- package/dist/core/services/logger.service.d.ts.map +1 -1
- package/dist/core/services/logger.service.js +167 -41
- package/dist/core/services/logger.service.js.map +1 -1
- package/dist/core/services/reactive.service.d.ts +146 -19
- package/dist/core/services/reactive.service.d.ts.map +1 -1
- package/dist/core/services/reactive.service.js +278 -137
- package/dist/core/services/reactive.service.js.map +1 -1
- package/dist/core/services/timing.service.d.ts +142 -20
- package/dist/core/services/timing.service.d.ts.map +1 -1
- package/dist/core/services/timing.service.js +324 -185
- package/dist/core/services/timing.service.js.map +1 -1
- package/dist/core/services/utils.service.d.ts +228 -43
- package/dist/core/services/utils.service.d.ts.map +1 -1
- package/dist/core/services/utils.service.js +305 -125
- package/dist/core/services/utils.service.js.map +1 -1
- package/dist/infrastructure/dom/dom.service.d.ts +307 -44
- package/dist/infrastructure/dom/dom.service.d.ts.map +1 -1
- package/dist/infrastructure/dom/dom.service.js +408 -129
- package/dist/infrastructure/dom/dom.service.js.map +1 -1
- package/dist/infrastructure/index.d.ts +0 -3
- package/dist/infrastructure/index.d.ts.map +1 -1
- package/dist/infrastructure/index.js +0 -3
- package/dist/infrastructure/index.js.map +1 -1
- package/dist/infrastructure/observer/observer.service.d.ts +124 -31
- package/dist/infrastructure/observer/observer.service.d.ts.map +1 -1
- package/dist/infrastructure/observer/observer.service.js +227 -131
- package/dist/infrastructure/observer/observer.service.js.map +1 -1
- package/dist/infrastructure/sensors/sensors.service.d.ts +154 -22
- package/dist/infrastructure/sensors/sensors.service.d.ts.map +1 -1
- package/dist/infrastructure/sensors/sensors.service.js +264 -112
- package/dist/infrastructure/sensors/sensors.service.js.map +1 -1
- package/dist/infrastructure/storage/storage.service.d.ts +123 -45
- package/dist/infrastructure/storage/storage.service.d.ts.map +1 -1
- package/dist/infrastructure/storage/storage.service.js +236 -66
- package/dist/infrastructure/storage/storage.service.js.map +1 -1
- package/dist/infrastructure/theme/theme.service.d.ts +93 -29
- package/dist/infrastructure/theme/theme.service.d.ts.map +1 -1
- package/dist/infrastructure/theme/theme.service.js +198 -96
- package/dist/infrastructure/theme/theme.service.js.map +1 -1
- package/dist/infrastructure/viewport/viewport.service.d.ts +233 -35
- package/dist/infrastructure/viewport/viewport.service.d.ts.map +1 -1
- package/dist/infrastructure/viewport/viewport.service.js +358 -139
- package/dist/infrastructure/viewport/viewport.service.js.map +1 -1
- package/dist/infrastructure/worker/worker.service.d.ts +84 -38
- package/dist/infrastructure/worker/worker.service.d.ts.map +1 -1
- package/dist/infrastructure/worker/worker.service.js +234 -133
- package/dist/infrastructure/worker/worker.service.js.map +1 -1
- package/dist/prisma/index.d.ts +2 -0
- package/dist/prisma/index.d.ts.map +1 -0
- package/dist/prisma/index.js +2 -0
- package/dist/prisma/index.js.map +1 -0
- package/dist/prisma/schema.json +11 -33
- package/dist/prisma/use-prisma.d.ts +68 -0
- package/dist/prisma/use-prisma.d.ts.map +1 -0
- package/dist/prisma/use-prisma.js +82 -0
- package/dist/prisma/use-prisma.js.map +1 -0
- package/dist/types/index.d.ts +20 -12
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +124 -125
- package/CHANGELOG.md +0 -101
|
@@ -1,34 +1,127 @@
|
|
|
1
1
|
import type { ObserverCallback, ObserverTarget } from "../../types/index.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
*
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
3
|
+
* Checks whether `IntersectionObserver` is available in the current environment.
|
|
4
|
+
*
|
|
5
|
+
* @returns `true` if `IntersectionObserver` is supported.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* if (useIsSupported()) {
|
|
10
|
+
* // safe to use observer APIs
|
|
11
|
+
* }
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export declare function useIsSupported(): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Creates an IntersectionObserver under the given key.
|
|
17
|
+
* If an observer with the same key already exists, it is disconnected first.
|
|
18
|
+
*
|
|
19
|
+
* @param key - A unique identifier for this observer.
|
|
20
|
+
* @param callback - Invoked when an observed element enters the viewport.
|
|
21
|
+
* @param options - IntersectionObserver options (default: `{ threshold: 0.1 }`).
|
|
22
|
+
* @param autoUnobserve - Whether to automatically unobserve after first intersection (default: `true`).
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```ts
|
|
26
|
+
* useObserverCreate("hero", (entry) => {
|
|
27
|
+
* console.log("Hero is visible!", entry.target);
|
|
28
|
+
* }, { threshold: 0.5 });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function useObserverCreate(key: string, callback: ObserverCallback, options?: IntersectionObserverInit, autoUnobserve?: boolean): void;
|
|
32
|
+
/**
|
|
33
|
+
* Starts observing a single element under an existing observer key.
|
|
34
|
+
*
|
|
35
|
+
* @param key - The observer key created via {@link useObserverCreate}.
|
|
36
|
+
* @param element - A CSS selector string or an HTMLElement to observe.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* useObserverObserve("hero", "#hero-image");
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export declare function useObserverObserve(key: string, element: ObserverTarget): void;
|
|
44
|
+
/**
|
|
45
|
+
* Observes all elements matching a CSS selector under an existing observer key.
|
|
46
|
+
*
|
|
47
|
+
* @param key - The observer key created via {@link useObserverCreate}.
|
|
48
|
+
* @param selector - A CSS selector string matching all elements to observe.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* useObserverObserveAll("images", "img.lazy");
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function useObserverObserveAll(key: string, selector: string): void;
|
|
56
|
+
/**
|
|
57
|
+
* Stops observing a specific element under an observer key.
|
|
58
|
+
*
|
|
59
|
+
* @param key - The observer key.
|
|
60
|
+
* @param element - The HTMLElement to stop observing.
|
|
61
|
+
*/
|
|
62
|
+
export declare function useObserverUnobserve(key: string, element: HTMLElement): void;
|
|
63
|
+
/**
|
|
64
|
+
* Disconnects and removes an observer by key, cleaning up all observed targets.
|
|
65
|
+
*
|
|
66
|
+
* @param key - The observer key to disconnect.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* useObserverDisconnect("hero");
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function useObserverDisconnect(key: string): void;
|
|
74
|
+
/**
|
|
75
|
+
* Disconnects and removes all registered observers.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* useObserverDisconnectAll(); // clean up everything
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
export declare function useObserverDisconnectAll(): void;
|
|
83
|
+
/**
|
|
84
|
+
* Checks whether an observer with the given key exists.
|
|
85
|
+
*
|
|
86
|
+
* @param key - The observer key to check.
|
|
87
|
+
* @returns `true` if an observer is registered under the key.
|
|
88
|
+
*/
|
|
89
|
+
export declare function useObserverHas(key: string): boolean;
|
|
90
|
+
/**
|
|
91
|
+
* Returns a list of all registered observer keys.
|
|
92
|
+
*
|
|
93
|
+
* @returns An array of observer key strings.
|
|
94
|
+
*/
|
|
95
|
+
export declare function useObserverKeys(): string[];
|
|
96
|
+
/**
|
|
97
|
+
* Initializes lazy loading for images using IntersectionObserver.
|
|
98
|
+
* Elements matching the selector must have a `data-src` attribute with the real image URL.
|
|
99
|
+
*
|
|
100
|
+
* @param key - A unique identifier for this lazy-loader instance (default: `"default"`).
|
|
101
|
+
* @param selector - CSS selector for lazy-loadable images (default: `"img[data-src]"`).
|
|
102
|
+
* @param rootMargin - IntersectionObserver root margin (default: `"200px"`).
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```ts
|
|
106
|
+
* useLazyLoaderInit("gallery", "img[data-src]", "300px");
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export declare function useLazyLoaderInit(key?: string, selector?: string, rootMargin?: string): void;
|
|
110
|
+
/**
|
|
111
|
+
* Stops a lazy-loader instance and disconnects its underlying observer.
|
|
112
|
+
*
|
|
113
|
+
* @param key - The lazy-loader key to stop.
|
|
114
|
+
*/
|
|
115
|
+
export declare function useLazyLoaderStop(key: string): void;
|
|
116
|
+
/**
|
|
117
|
+
* Stops all active lazy-loader instances.
|
|
118
|
+
*/
|
|
119
|
+
export declare function useLazyLoaderStopAll(): void;
|
|
120
|
+
/**
|
|
121
|
+
* Checks whether a lazy-loader with the given key is active.
|
|
122
|
+
*
|
|
123
|
+
* @param key - The lazy-loader key to check.
|
|
124
|
+
* @returns `true` if the lazy-loader is registered.
|
|
125
|
+
*/
|
|
126
|
+
export declare function useLazyLoaderHas(key: string): boolean;
|
|
34
127
|
//# sourceMappingURL=observer.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observer.service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/observer/observer.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEX,gBAAgB,EAGhB,cAAc,EACd,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"observer.service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/observer/observer.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEX,gBAAgB,EAGhB,cAAc,EACd,MAAM,sBAAsB,CAAC;AA8B9B;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAChC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,GAAE,wBAA6C,EACtD,aAAa,UAAO,GAClB,IAAI,CAwBN;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAY7E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAKzE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAM5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAOvD;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAI/C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAE1C;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAChC,GAAG,SAAY,EACf,QAAQ,SAAkB,EAC1B,UAAU,SAAU,GAClB,IAAI,CAyBN;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAMnD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAI3C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD"}
|
|
@@ -1,145 +1,241 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useLogger } from "../../core/services/logger.service.js";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// Module-level state
|
|
4
|
+
// ============================================================
|
|
5
|
+
/** Registry of active IntersectionObserver instances keyed by string. */
|
|
6
|
+
const registry = new Map();
|
|
7
|
+
/** Registry of active lazy-loader entries keyed by string. */
|
|
8
|
+
const lazyRegistry = new Map();
|
|
9
|
+
// ============================================================
|
|
10
|
+
// Internal helpers
|
|
11
|
+
// ============================================================
|
|
2
12
|
/**
|
|
3
|
-
*
|
|
13
|
+
* Resolves an `ObserverTarget` to an HTMLElement.
|
|
14
|
+
*
|
|
15
|
+
* @param element - A CSS selector string or an HTMLElement.
|
|
16
|
+
* @returns The resolved element, or `null` if not found.
|
|
4
17
|
*/
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
18
|
+
function resolveTarget(element) {
|
|
19
|
+
return typeof element === "string" ? document.querySelector(element) : element;
|
|
20
|
+
}
|
|
21
|
+
// ============================================================
|
|
22
|
+
// Observer functions
|
|
23
|
+
// ============================================================
|
|
24
|
+
/**
|
|
25
|
+
* Checks whether `IntersectionObserver` is available in the current environment.
|
|
26
|
+
*
|
|
27
|
+
* @returns `true` if `IntersectionObserver` is supported.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* if (useIsSupported()) {
|
|
32
|
+
* // safe to use observer APIs
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function useIsSupported() {
|
|
37
|
+
return typeof window !== "undefined" && "IntersectionObserver" in window;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Creates an IntersectionObserver under the given key.
|
|
41
|
+
* If an observer with the same key already exists, it is disconnected first.
|
|
42
|
+
*
|
|
43
|
+
* @param key - A unique identifier for this observer.
|
|
44
|
+
* @param callback - Invoked when an observed element enters the viewport.
|
|
45
|
+
* @param options - IntersectionObserver options (default: `{ threshold: 0.1 }`).
|
|
46
|
+
* @param autoUnobserve - Whether to automatically unobserve after first intersection (default: `true`).
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* useObserverCreate("hero", (entry) => {
|
|
51
|
+
* console.log("Hero is visible!", entry.target);
|
|
52
|
+
* }, { threshold: 0.5 });
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export function useObserverCreate(key, callback, options = { threshold: 0.1 }, autoUnobserve = true) {
|
|
56
|
+
if (!useIsSupported()) {
|
|
57
|
+
useLogger("warn", "[ObserverService] IntersectionObserver not supported.");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (registry.has(key)) {
|
|
61
|
+
useObserverDisconnect(key);
|
|
62
|
+
}
|
|
63
|
+
const config = { callback, options, autoUnobserve };
|
|
64
|
+
const observer = new IntersectionObserver((entries) => {
|
|
65
|
+
for (const entry of entries) {
|
|
66
|
+
if (entry.isIntersecting) {
|
|
67
|
+
config.callback(entry);
|
|
68
|
+
if (config.autoUnobserve) {
|
|
69
|
+
useObserverUnobserve(key, entry.target);
|
|
34
70
|
}
|
|
35
71
|
}
|
|
36
|
-
}, config.options);
|
|
37
|
-
this.registry.set(key, { config, observer, targets: new Set() });
|
|
38
|
-
return this;
|
|
39
|
-
}
|
|
40
|
-
resolveTarget(element) {
|
|
41
|
-
return typeof element === "string" ? document.querySelector(element) : element;
|
|
42
|
-
}
|
|
43
|
-
useObserve(key, element) {
|
|
44
|
-
const entry = this.registry.get(key);
|
|
45
|
-
if (!entry?.observer)
|
|
46
|
-
return this;
|
|
47
|
-
const target = this.resolveTarget(element);
|
|
48
|
-
if (!target) {
|
|
49
|
-
useLog("warn", `[ObserverService] Target not found for key "${key}":`, element);
|
|
50
|
-
return this;
|
|
51
|
-
}
|
|
52
|
-
entry.targets.add(target);
|
|
53
|
-
entry.observer.observe(target);
|
|
54
|
-
return this;
|
|
55
|
-
}
|
|
56
|
-
useObserveAll(key, selector) {
|
|
57
|
-
if (!ObserverService.useIsSupported())
|
|
58
|
-
return this;
|
|
59
|
-
for (const el of document.querySelectorAll(selector)) {
|
|
60
|
-
this.useObserve(key, el);
|
|
61
72
|
}
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
useUnobserve(key, element) {
|
|
65
|
-
const entry = this.registry.get(key);
|
|
66
|
-
if (!entry?.observer)
|
|
67
|
-
return this;
|
|
68
|
-
entry.observer.unobserve(element);
|
|
69
|
-
entry.targets.delete(element);
|
|
70
|
-
return this;
|
|
71
|
-
}
|
|
72
|
-
useDisconnect(key) {
|
|
73
|
-
const entry = this.registry.get(key);
|
|
74
|
-
if (!entry)
|
|
75
|
-
return this;
|
|
76
|
-
entry.observer?.disconnect();
|
|
77
|
-
entry.targets.clear();
|
|
78
|
-
this.registry.delete(key);
|
|
79
|
-
return this;
|
|
80
|
-
}
|
|
81
|
-
useDisconnectAll() {
|
|
82
|
-
for (const key of this.registry.keys()) {
|
|
83
|
-
this.useDisconnect(key);
|
|
84
|
-
}
|
|
85
|
-
return this;
|
|
86
|
-
}
|
|
87
|
-
useHas(key) {
|
|
88
|
-
return this.registry.has(key);
|
|
89
|
-
}
|
|
90
|
-
useKeys() {
|
|
91
|
-
return Array.from(this.registry.keys());
|
|
92
|
-
}
|
|
73
|
+
}, config.options);
|
|
74
|
+
registry.set(key, { config, observer, targets: new Set() });
|
|
93
75
|
}
|
|
94
76
|
/**
|
|
95
|
-
*
|
|
77
|
+
* Starts observing a single element under an existing observer key.
|
|
78
|
+
*
|
|
79
|
+
* @param key - The observer key created via {@link useObserverCreate}.
|
|
80
|
+
* @param element - A CSS selector string or an HTMLElement to observe.
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* ```ts
|
|
84
|
+
* useObserverObserve("hero", "#hero-image");
|
|
85
|
+
* ```
|
|
96
86
|
*/
|
|
97
|
-
export
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return this;
|
|
87
|
+
export function useObserverObserve(key, element) {
|
|
88
|
+
const entry = registry.get(key);
|
|
89
|
+
if (!entry?.observer)
|
|
90
|
+
return;
|
|
91
|
+
const target = resolveTarget(element);
|
|
92
|
+
if (!target) {
|
|
93
|
+
useLogger("warn", `[ObserverService] Target not found for key "${key}":`, element);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
entry.targets.add(target);
|
|
97
|
+
entry.observer.observe(target);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Observes all elements matching a CSS selector under an existing observer key.
|
|
101
|
+
*
|
|
102
|
+
* @param key - The observer key created via {@link useObserverCreate}.
|
|
103
|
+
* @param selector - A CSS selector string matching all elements to observe.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```ts
|
|
107
|
+
* useObserverObserveAll("images", "img.lazy");
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export function useObserverObserveAll(key, selector) {
|
|
111
|
+
if (!useIsSupported())
|
|
112
|
+
return;
|
|
113
|
+
for (const el of document.querySelectorAll(selector)) {
|
|
114
|
+
useObserverObserve(key, el);
|
|
126
115
|
}
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Stops observing a specific element under an observer key.
|
|
119
|
+
*
|
|
120
|
+
* @param key - The observer key.
|
|
121
|
+
* @param element - The HTMLElement to stop observing.
|
|
122
|
+
*/
|
|
123
|
+
export function useObserverUnobserve(key, element) {
|
|
124
|
+
const entry = registry.get(key);
|
|
125
|
+
if (!entry?.observer)
|
|
126
|
+
return;
|
|
127
|
+
entry.observer.unobserve(element);
|
|
128
|
+
entry.targets.delete(element);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Disconnects and removes an observer by key, cleaning up all observed targets.
|
|
132
|
+
*
|
|
133
|
+
* @param key - The observer key to disconnect.
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```ts
|
|
137
|
+
* useObserverDisconnect("hero");
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
export function useObserverDisconnect(key) {
|
|
141
|
+
const entry = registry.get(key);
|
|
142
|
+
if (!entry)
|
|
143
|
+
return;
|
|
144
|
+
entry.observer?.disconnect();
|
|
145
|
+
entry.targets.clear();
|
|
146
|
+
registry.delete(key);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Disconnects and removes all registered observers.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```ts
|
|
153
|
+
* useObserverDisconnectAll(); // clean up everything
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export function useObserverDisconnectAll() {
|
|
157
|
+
for (const key of registry.keys()) {
|
|
158
|
+
useObserverDisconnect(key);
|
|
134
159
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Checks whether an observer with the given key exists.
|
|
163
|
+
*
|
|
164
|
+
* @param key - The observer key to check.
|
|
165
|
+
* @returns `true` if an observer is registered under the key.
|
|
166
|
+
*/
|
|
167
|
+
export function useObserverHas(key) {
|
|
168
|
+
return registry.has(key);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Returns a list of all registered observer keys.
|
|
172
|
+
*
|
|
173
|
+
* @returns An array of observer key strings.
|
|
174
|
+
*/
|
|
175
|
+
export function useObserverKeys() {
|
|
176
|
+
return Array.from(registry.keys());
|
|
177
|
+
}
|
|
178
|
+
// ============================================================
|
|
179
|
+
// Lazy-loader functions
|
|
180
|
+
// ============================================================
|
|
181
|
+
/**
|
|
182
|
+
* Initializes lazy loading for images using IntersectionObserver.
|
|
183
|
+
* Elements matching the selector must have a `data-src` attribute with the real image URL.
|
|
184
|
+
*
|
|
185
|
+
* @param key - A unique identifier for this lazy-loader instance (default: `"default"`).
|
|
186
|
+
* @param selector - CSS selector for lazy-loadable images (default: `"img[data-src]"`).
|
|
187
|
+
* @param rootMargin - IntersectionObserver root margin (default: `"200px"`).
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* ```ts
|
|
191
|
+
* useLazyLoaderInit("gallery", "img[data-src]", "300px");
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
export function useLazyLoaderInit(key = "default", selector = "img[data-src]", rootMargin = "200px") {
|
|
195
|
+
if (!useIsSupported())
|
|
196
|
+
return;
|
|
197
|
+
if (lazyRegistry.has(key)) {
|
|
198
|
+
useLazyLoaderStop(key);
|
|
199
|
+
}
|
|
200
|
+
const observerKey = `lazy_loader_${key}`;
|
|
201
|
+
useObserverCreate(observerKey, (entry) => {
|
|
202
|
+
const img = entry.target;
|
|
203
|
+
const dataSrc = img.dataset.src;
|
|
204
|
+
if (dataSrc) {
|
|
205
|
+
img.src = dataSrc;
|
|
206
|
+
img.removeAttribute("data-src");
|
|
138
207
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
208
|
+
}, { rootMargin }, true);
|
|
209
|
+
useObserverObserveAll(observerKey, selector);
|
|
210
|
+
lazyRegistry.set(key, { selector, observerKey });
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Stops a lazy-loader instance and disconnects its underlying observer.
|
|
214
|
+
*
|
|
215
|
+
* @param key - The lazy-loader key to stop.
|
|
216
|
+
*/
|
|
217
|
+
export function useLazyLoaderStop(key) {
|
|
218
|
+
const entry = lazyRegistry.get(key);
|
|
219
|
+
if (!entry)
|
|
220
|
+
return;
|
|
221
|
+
useObserverDisconnect(entry.observerKey);
|
|
222
|
+
lazyRegistry.delete(key);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Stops all active lazy-loader instances.
|
|
226
|
+
*/
|
|
227
|
+
export function useLazyLoaderStopAll() {
|
|
228
|
+
for (const key of lazyRegistry.keys()) {
|
|
229
|
+
useLazyLoaderStop(key);
|
|
143
230
|
}
|
|
144
231
|
}
|
|
232
|
+
/**
|
|
233
|
+
* Checks whether a lazy-loader with the given key is active.
|
|
234
|
+
*
|
|
235
|
+
* @param key - The lazy-loader key to check.
|
|
236
|
+
* @returns `true` if the lazy-loader is registered.
|
|
237
|
+
*/
|
|
238
|
+
export function useLazyLoaderHas(key) {
|
|
239
|
+
return lazyRegistry.has(key);
|
|
240
|
+
}
|
|
145
241
|
//# sourceMappingURL=observer.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observer.service.js","sourceRoot":"","sources":["../../../src/infrastructure/observer/observer.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"observer.service.js","sourceRoot":"","sources":["../../../src/infrastructure/observer/observer.service.ts"],"names":[],"mappings":"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"}
|