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.
Files changed (148) hide show
  1. package/README.md +72 -437
  2. package/dist/adapters/astro/astro.service.d.ts +103 -15
  3. package/dist/adapters/astro/astro.service.d.ts.map +1 -1
  4. package/dist/adapters/astro/astro.service.js +145 -75
  5. package/dist/adapters/astro/astro.service.js.map +1 -1
  6. package/dist/adapters/astro/index.d.ts +1 -1
  7. package/dist/adapters/astro/index.d.ts.map +1 -1
  8. package/dist/adapters/astro/index.js +1 -1
  9. package/dist/adapters/astro/index.js.map +1 -1
  10. package/dist/adapters/astro/rss.service.d.ts +85 -105
  11. package/dist/adapters/astro/rss.service.d.ts.map +1 -1
  12. package/dist/adapters/astro/rss.service.js +172 -168
  13. package/dist/adapters/astro/rss.service.js.map +1 -1
  14. package/dist/adapters/astro/seo.service.d.ts +10 -0
  15. package/dist/adapters/astro/seo.service.d.ts.map +1 -0
  16. package/dist/adapters/astro/seo.service.js +3 -0
  17. package/dist/adapters/astro/seo.service.js.map +1 -0
  18. package/dist/adapters/express/app.d.ts +30 -1
  19. package/dist/adapters/express/app.d.ts.map +1 -1
  20. package/dist/adapters/express/app.js +31 -3
  21. package/dist/adapters/express/app.js.map +1 -1
  22. package/dist/adapters/express/index.d.ts +2 -2
  23. package/dist/adapters/express/index.d.ts.map +1 -1
  24. package/dist/adapters/express/index.js +2 -2
  25. package/dist/adapters/express/index.js.map +1 -1
  26. package/dist/adapters/express/main.js +2 -2
  27. package/dist/adapters/express/main.js.map +1 -1
  28. package/dist/adapters/express/products.controller.d.ts +67 -8
  29. package/dist/adapters/express/products.controller.d.ts.map +1 -1
  30. package/dist/adapters/express/products.controller.js +105 -49
  31. package/dist/adapters/express/products.controller.js.map +1 -1
  32. package/dist/adapters/express/server.d.ts +37 -13
  33. package/dist/adapters/express/server.d.ts.map +1 -1
  34. package/dist/adapters/express/server.js +118 -53
  35. package/dist/adapters/express/server.js.map +1 -1
  36. package/dist/adapters/nuxt/nuxt.service.d.ts +8 -6
  37. package/dist/adapters/nuxt/nuxt.service.d.ts.map +1 -1
  38. package/dist/adapters/nuxt/nuxt.service.js +34 -10
  39. package/dist/adapters/nuxt/nuxt.service.js.map +1 -1
  40. package/dist/adapters/vue/vue.service.d.ts +5 -2
  41. package/dist/adapters/vue/vue.service.d.ts.map +1 -1
  42. package/dist/adapters/vue/vue.service.js +41 -7
  43. package/dist/adapters/vue/vue.service.js.map +1 -1
  44. package/dist/config/index.d.ts +2 -1
  45. package/dist/config/index.d.ts.map +1 -1
  46. package/dist/config/index.js +1 -1
  47. package/dist/config/index.js.map +1 -1
  48. package/dist/config/seo-meta.types.d.ts +177 -0
  49. package/dist/config/seo-meta.types.d.ts.map +1 -0
  50. package/dist/config/seo-meta.types.js +11 -0
  51. package/dist/config/seo-meta.types.js.map +1 -0
  52. package/dist/config/seo.service.d.ts +41 -58
  53. package/dist/config/seo.service.d.ts.map +1 -1
  54. package/dist/config/seo.service.js +468 -136
  55. package/dist/config/seo.service.js.map +1 -1
  56. package/dist/config/site.config.d.ts +10 -50
  57. package/dist/config/site.config.d.ts.map +1 -1
  58. package/dist/config/site.config.js +8 -36
  59. package/dist/config/site.config.js.map +1 -1
  60. package/dist/core/index.d.ts +1 -3
  61. package/dist/core/index.d.ts.map +1 -1
  62. package/dist/core/index.js +1 -3
  63. package/dist/core/index.js.map +1 -1
  64. package/dist/core/services/dates.service.d.ts +149 -22
  65. package/dist/core/services/dates.service.d.ts.map +1 -1
  66. package/dist/core/services/dates.service.js +201 -54
  67. package/dist/core/services/dates.service.js.map +1 -1
  68. package/dist/core/services/error.service.d.ts +32 -20
  69. package/dist/core/services/error.service.d.ts.map +1 -1
  70. package/dist/core/services/error.service.js +44 -32
  71. package/dist/core/services/error.service.js.map +1 -1
  72. package/dist/core/services/formatter.service.d.ts +245 -35
  73. package/dist/core/services/formatter.service.d.ts.map +1 -1
  74. package/dist/core/services/formatter.service.js +281 -57
  75. package/dist/core/services/formatter.service.js.map +1 -1
  76. package/dist/core/services/generator.service.d.ts +115 -26
  77. package/dist/core/services/generator.service.d.ts.map +1 -1
  78. package/dist/core/services/generator.service.js +191 -56
  79. package/dist/core/services/generator.service.js.map +1 -1
  80. package/dist/core/services/geometry.service.d.ts +369 -39
  81. package/dist/core/services/geometry.service.d.ts.map +1 -1
  82. package/dist/core/services/geometry.service.js +424 -66
  83. package/dist/core/services/geometry.service.js.map +1 -1
  84. package/dist/core/services/http.service.d.ts +244 -21
  85. package/dist/core/services/http.service.d.ts.map +1 -1
  86. package/dist/core/services/http.service.js +419 -98
  87. package/dist/core/services/http.service.js.map +1 -1
  88. package/dist/core/services/logger.service.d.ts +95 -29
  89. package/dist/core/services/logger.service.d.ts.map +1 -1
  90. package/dist/core/services/logger.service.js +167 -41
  91. package/dist/core/services/logger.service.js.map +1 -1
  92. package/dist/core/services/reactive.service.d.ts +146 -19
  93. package/dist/core/services/reactive.service.d.ts.map +1 -1
  94. package/dist/core/services/reactive.service.js +278 -137
  95. package/dist/core/services/reactive.service.js.map +1 -1
  96. package/dist/core/services/timing.service.d.ts +142 -20
  97. package/dist/core/services/timing.service.d.ts.map +1 -1
  98. package/dist/core/services/timing.service.js +324 -185
  99. package/dist/core/services/timing.service.js.map +1 -1
  100. package/dist/core/services/utils.service.d.ts +228 -43
  101. package/dist/core/services/utils.service.d.ts.map +1 -1
  102. package/dist/core/services/utils.service.js +305 -125
  103. package/dist/core/services/utils.service.js.map +1 -1
  104. package/dist/infrastructure/dom/dom.service.d.ts +307 -44
  105. package/dist/infrastructure/dom/dom.service.d.ts.map +1 -1
  106. package/dist/infrastructure/dom/dom.service.js +408 -129
  107. package/dist/infrastructure/dom/dom.service.js.map +1 -1
  108. package/dist/infrastructure/index.d.ts +0 -3
  109. package/dist/infrastructure/index.d.ts.map +1 -1
  110. package/dist/infrastructure/index.js +0 -3
  111. package/dist/infrastructure/index.js.map +1 -1
  112. package/dist/infrastructure/observer/observer.service.d.ts +124 -31
  113. package/dist/infrastructure/observer/observer.service.d.ts.map +1 -1
  114. package/dist/infrastructure/observer/observer.service.js +227 -131
  115. package/dist/infrastructure/observer/observer.service.js.map +1 -1
  116. package/dist/infrastructure/sensors/sensors.service.d.ts +154 -22
  117. package/dist/infrastructure/sensors/sensors.service.d.ts.map +1 -1
  118. package/dist/infrastructure/sensors/sensors.service.js +264 -112
  119. package/dist/infrastructure/sensors/sensors.service.js.map +1 -1
  120. package/dist/infrastructure/storage/storage.service.d.ts +123 -45
  121. package/dist/infrastructure/storage/storage.service.d.ts.map +1 -1
  122. package/dist/infrastructure/storage/storage.service.js +236 -66
  123. package/dist/infrastructure/storage/storage.service.js.map +1 -1
  124. package/dist/infrastructure/theme/theme.service.d.ts +93 -29
  125. package/dist/infrastructure/theme/theme.service.d.ts.map +1 -1
  126. package/dist/infrastructure/theme/theme.service.js +198 -96
  127. package/dist/infrastructure/theme/theme.service.js.map +1 -1
  128. package/dist/infrastructure/viewport/viewport.service.d.ts +233 -35
  129. package/dist/infrastructure/viewport/viewport.service.d.ts.map +1 -1
  130. package/dist/infrastructure/viewport/viewport.service.js +358 -139
  131. package/dist/infrastructure/viewport/viewport.service.js.map +1 -1
  132. package/dist/infrastructure/worker/worker.service.d.ts +84 -38
  133. package/dist/infrastructure/worker/worker.service.d.ts.map +1 -1
  134. package/dist/infrastructure/worker/worker.service.js +234 -133
  135. package/dist/infrastructure/worker/worker.service.js.map +1 -1
  136. package/dist/prisma/index.d.ts +2 -0
  137. package/dist/prisma/index.d.ts.map +1 -0
  138. package/dist/prisma/index.js +2 -0
  139. package/dist/prisma/index.js.map +1 -0
  140. package/dist/prisma/schema.json +11 -33
  141. package/dist/prisma/use-prisma.d.ts +68 -0
  142. package/dist/prisma/use-prisma.d.ts.map +1 -0
  143. package/dist/prisma/use-prisma.js +82 -0
  144. package/dist/prisma/use-prisma.js.map +1 -0
  145. package/dist/types/index.d.ts +20 -12
  146. package/dist/types/index.d.ts.map +1 -1
  147. package/package.json +124 -125
  148. package/CHANGELOG.md +0 -101
@@ -1,34 +1,127 @@
1
1
  import type { ObserverCallback, ObserverTarget } from "../../types/index.js";
2
2
  /**
3
- * Singleton wrapper around the native IntersectionObserver API.
4
- */
5
- export declare class ObserverService {
6
- private static instance;
7
- private registry;
8
- private constructor();
9
- static getInstance(): ObserverService;
10
- static useIsSupported(): boolean;
11
- useCreate(key: string, callback: ObserverCallback, options?: IntersectionObserverInit, autoUnobserve?: boolean): this;
12
- private resolveTarget;
13
- useObserve(key: string, element: ObserverTarget): this;
14
- useObserveAll(key: string, selector: string): this;
15
- useUnobserve(key: string, element: HTMLElement): this;
16
- useDisconnect(key: string): this;
17
- useDisconnectAll(): this;
18
- useHas(key: string): boolean;
19
- useKeys(): string[];
20
- }
21
- /**
22
- * Singleton service for lazy loading images using IntersectionObserver.
23
- */
24
- export declare class LazyLoaderService {
25
- private static instance;
26
- private registry;
27
- private constructor();
28
- static getInstance(): LazyLoaderService;
29
- useInit(key?: string, selector?: string, rootMargin?: string): this;
30
- useStop(key: string): this;
31
- useStopAll(): this;
32
- useHas(key: string): boolean;
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;AAE9B;;GAEG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAyC;IAEzD,OAAO,eAAiB;IAExB,MAAM,CAAC,WAAW,IAAI,eAAe,CAKpC;IAED,MAAM,CAAC,cAAc,IAAI,OAAO,CAE/B;IAED,SAAS,CACR,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,GAAE,wBAA6C,EACtD,aAAa,UAAO,GAClB,IAAI,CAyBN;IAED,OAAO,CAAC,aAAa;IAIrB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI,CAarD;IAED,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMjD;IAED,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAOpD;IAED,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAQ/B;IAED,gBAAgB,IAAI,IAAI,CAKvB;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE3B;IAED,OAAO,IAAI,MAAM,EAAE,CAElB;CACD;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAA2C;IAE3D,OAAO,eAAiB;IAExB,MAAM,CAAC,WAAW,IAAI,iBAAiB,CAKtC;IAED,OAAO,CAAC,GAAG,SAAY,EAAE,QAAQ,SAAkB,EAAE,UAAU,SAAU,GAAG,IAAI,CA2B/E;IAED,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAOzB;IAED,UAAU,IAAI,IAAI,CAKjB;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE3B;CACD"}
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 { useLog } from "../../core/services/logger.service.js";
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
- * Singleton wrapper around the native IntersectionObserver API.
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
- export class ObserverService {
6
- static instance;
7
- registry = new Map();
8
- constructor() { }
9
- static getInstance() {
10
- if (!ObserverService.instance) {
11
- ObserverService.instance = new ObserverService();
12
- }
13
- return ObserverService.instance;
14
- }
15
- static useIsSupported() {
16
- return typeof window !== "undefined" && "IntersectionObserver" in window;
17
- }
18
- useCreate(key, callback, options = { threshold: 0.1 }, autoUnobserve = true) {
19
- if (!ObserverService.useIsSupported()) {
20
- useLog("warn", "[ObserverService] IntersectionObserver not supported.");
21
- return this;
22
- }
23
- if (this.registry.has(key)) {
24
- this.useDisconnect(key);
25
- }
26
- const config = { callback, options, autoUnobserve };
27
- const observer = new IntersectionObserver((entries) => {
28
- for (const entry of entries) {
29
- if (entry.isIntersecting) {
30
- config.callback(entry);
31
- if (config.autoUnobserve) {
32
- this.useUnobserve(key, entry.target);
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
- return this;
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
- * Singleton service for lazy loading images using IntersectionObserver.
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 class LazyLoaderService {
98
- static instance;
99
- registry = new Map();
100
- constructor() { }
101
- static getInstance() {
102
- if (!LazyLoaderService.instance) {
103
- LazyLoaderService.instance = new LazyLoaderService();
104
- }
105
- return LazyLoaderService.instance;
106
- }
107
- useInit(key = "default", selector = "img[data-src]", rootMargin = "200px") {
108
- if (!ObserverService.useIsSupported())
109
- return this;
110
- if (this.registry.has(key)) {
111
- this.useStop(key);
112
- }
113
- const observer = ObserverService.getInstance();
114
- const observerKey = `lazy_loader_${key}`;
115
- observer.useCreate(observerKey, (entry) => {
116
- const img = entry.target;
117
- const dataSrc = img.dataset.src;
118
- if (dataSrc) {
119
- img.src = dataSrc;
120
- img.removeAttribute("data-src");
121
- }
122
- }, { rootMargin }, true);
123
- observer.useObserveAll(observerKey, selector);
124
- this.registry.set(key, { selector, observerKey });
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
- useStop(key) {
128
- const entry = this.registry.get(key);
129
- if (!entry)
130
- return this;
131
- ObserverService.getInstance().useDisconnect(entry.observerKey);
132
- this.registry.delete(key);
133
- return this;
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
- useStopAll() {
136
- for (const key of this.registry.keys()) {
137
- this.useStop(key);
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
- return this;
140
- }
141
- useHas(key) {
142
- return this.registry.has(key);
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,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAU/D;;GAEG;AACH,MAAM,OAAO,eAAe;IACnB,MAAM,CAAC,QAAQ,CAAkB;IACjC,QAAQ,GAA+B,IAAI,GAAG,EAAE,CAAC;IAEzD,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QACjB,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;YAC/B,eAAe,CAAC,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;QAClD,CAAC;QACD,OAAO,eAAe,CAAC,QAAQ,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,cAAc;QACpB,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,sBAAsB,IAAI,MAAM,CAAC;IAC1E,CAAC;IAED,SAAS,CACR,GAAW,EACX,QAA0B,EAC1B,OAAO,GAA6B,EAAE,SAAS,EAAE,GAAG,EAAE,EACtD,aAAa,GAAG,IAAI;QAEpB,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,EAAE,uDAAuD,CAAC,CAAC;YACxE,OAAO,IAAI,CAAC;QACb,CAAC;QAED,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,MAAM,GAAmB,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAEpE,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,CAAC,OAAO,EAAE,EAAE;YACrD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;oBAC1B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;oBACvB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;wBAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,MAAqB,CAAC,CAAC;oBACrD,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAEnB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC;IACb,CAAC;IAEO,aAAa,CAAC,OAAuB;QAC5C,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAc,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7F,CAAC;IAED,UAAU,CAAC,GAAW,EAAE,OAAuB;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,QAAQ;YAAE,OAAO,IAAI,CAAC;QAElC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,CAAC,MAAM,EAAE,+CAA+C,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;YAChF,OAAO,IAAI,CAAC;QACb,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,aAAa,CAAC,GAAW,EAAE,QAAgB;QAC1C,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE;YAAE,OAAO,IAAI,CAAC;QACnD,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,gBAAgB,CAAc,QAAQ,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,YAAY,CAAC,GAAW,EAAE,OAAoB;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,QAAQ;YAAE,OAAO,IAAI,CAAC;QAElC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,aAAa,CAAC,GAAW;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,KAAK,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;QAC7B,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,gBAAgB;QACf,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO;QACN,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;CACD;AAED;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACrB,MAAM,CAAC,QAAQ,CAAoB;IACnC,QAAQ,GAAiC,IAAI,GAAG,EAAE,CAAC;IAE3D,gBAAuB,CAAC;IAExB,MAAM,CAAC,WAAW;QACjB,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;YACjC,iBAAiB,CAAC,QAAQ,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACtD,CAAC;QACD,OAAO,iBAAiB,CAAC,QAAQ,CAAC;IACnC,CAAC;IAED,OAAO,CAAC,GAAG,GAAG,SAAS,EAAE,QAAQ,GAAG,eAAe,EAAE,UAAU,GAAG,OAAO;QACxE,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE;YAAE,OAAO,IAAI,CAAC;QAEnD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC;QAC/C,MAAM,WAAW,GAAG,eAAe,GAAG,EAAE,CAAC;QAEzC,QAAQ,CAAC,SAAS,CACjB,WAAW,EACX,CAAC,KAAK,EAAE,EAAE;YACT,MAAM,GAAG,GAAG,KAAK,CAAC,MAA0B,CAAC;YAC7C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;YAChC,IAAI,OAAO,EAAE,CAAC;gBACb,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC;gBAClB,GAAG,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACjC,CAAC;QACF,CAAC,EACD,EAAE,UAAU,EAAE,EACd,IAAI,CACJ,CAAC;QAEF,QAAQ,CAAC,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,OAAO,CAAC,GAAW;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,eAAe,CAAC,WAAW,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,OAAO,IAAI,CAAC;IACb,CAAC;IAED,UAAU;QACT,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,MAAM,CAAC,GAAW;QACjB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;CACD"}
1
+ {"version":3,"file":"observer.service.js","sourceRoot":"","sources":["../../../src/infrastructure/observer/observer.service.ts"],"names":[],"mappings":"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"}