@acorex/core 22.2.9 → 22.2.10
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.
|
@@ -1,92 +1,189 @@
|
|
|
1
1
|
import { AXZIndexService } from '@acorex/core/z-index';
|
|
2
|
+
import { DOCUMENT, isPlatformBrowser } from '@angular/common';
|
|
2
3
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { inject, signal, Injectable } from '@angular/core';
|
|
4
|
+
import { inject, PLATFORM_ID, DestroyRef, signal, Injectable } from '@angular/core';
|
|
4
5
|
|
|
5
6
|
class AXFullScreenService {
|
|
6
7
|
constructor() {
|
|
7
8
|
this.zIndexService = inject(AXZIndexService);
|
|
9
|
+
this.document = inject(DOCUMENT);
|
|
10
|
+
this.platformId = inject(PLATFORM_ID);
|
|
11
|
+
this.destroyRef = inject(DestroyRef);
|
|
8
12
|
/**
|
|
9
|
-
* Current fullscreen state
|
|
13
|
+
* Current fullscreen state.
|
|
10
14
|
*/
|
|
11
15
|
this.isFullscreenState = signal(false, /* @ts-ignore */
|
|
12
16
|
...(ngDevMode ? [{ debugName: "isFullscreenState" }] : /* istanbul ignore next */ []));
|
|
13
17
|
/**
|
|
14
|
-
*
|
|
18
|
+
* Active fullscreen element.
|
|
19
|
+
*/
|
|
20
|
+
this.activeElementState = signal(null, /* @ts-ignore */
|
|
21
|
+
...(ngDevMode ? [{ debugName: "activeElementState" }] : /* istanbul ignore next */ []));
|
|
22
|
+
/**
|
|
23
|
+
* Active fullscreen mode.
|
|
24
|
+
*/
|
|
25
|
+
this.currentMode = null;
|
|
26
|
+
/**
|
|
27
|
+
* Original element styles to restore (overlay mode).
|
|
15
28
|
*/
|
|
16
29
|
this.originalStyles = {};
|
|
17
30
|
/**
|
|
18
|
-
* Original parent element reference
|
|
31
|
+
* Original parent element reference (overlay mode).
|
|
19
32
|
*/
|
|
20
33
|
this.originalParent = null;
|
|
21
34
|
/**
|
|
22
|
-
* Fullscreen container element
|
|
35
|
+
* Fullscreen container element (overlay mode).
|
|
23
36
|
*/
|
|
24
37
|
this.fullscreenContainer = null;
|
|
25
38
|
/**
|
|
26
|
-
* Z-index token for
|
|
39
|
+
* Z-index token for overlay fullscreen.
|
|
27
40
|
*/
|
|
28
41
|
this.zToken = null;
|
|
42
|
+
this.fullscreenChangeHandler = () => {
|
|
43
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (this.currentMode !== 'browser') {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const activeElement = this.activeElementState();
|
|
50
|
+
if (!activeElement) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const fullscreenElement = this.getFullscreenElement();
|
|
54
|
+
if (fullscreenElement !== activeElement) {
|
|
55
|
+
this.clearBrowserState();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Read-only signal of the active fullscreen element.
|
|
60
|
+
*/
|
|
61
|
+
this.activeElement = this.activeElementState.asReadonly();
|
|
62
|
+
/**
|
|
63
|
+
* Read-only signal of the fullscreen state.
|
|
64
|
+
*/
|
|
65
|
+
this.fullscreen = this.isFullscreenState.asReadonly();
|
|
66
|
+
if (isPlatformBrowser(this.platformId)) {
|
|
67
|
+
this.document.addEventListener('fullscreenchange', this.fullscreenChangeHandler);
|
|
68
|
+
this.document.addEventListener('webkitfullscreenchange', this.fullscreenChangeHandler);
|
|
69
|
+
this.destroyRef.onDestroy(() => {
|
|
70
|
+
this.document.removeEventListener('fullscreenchange', this.fullscreenChangeHandler);
|
|
71
|
+
this.document.removeEventListener('webkitfullscreenchange', this.fullscreenChangeHandler);
|
|
72
|
+
const activeElement = this.activeElementState();
|
|
73
|
+
if (activeElement) {
|
|
74
|
+
this.exit(activeElement);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}
|
|
29
78
|
}
|
|
30
79
|
/**
|
|
31
|
-
* Toggle fullscreen state
|
|
80
|
+
* Toggle fullscreen state.
|
|
32
81
|
*/
|
|
33
|
-
toggle(element) {
|
|
34
|
-
if (this.
|
|
82
|
+
toggle(element, mode = 'overlay') {
|
|
83
|
+
if (this.isActive(element)) {
|
|
35
84
|
this.exit(element);
|
|
36
85
|
}
|
|
37
86
|
else {
|
|
38
|
-
this.enter(element);
|
|
87
|
+
this.enter(element, mode);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Enter fullscreen mode.
|
|
92
|
+
*/
|
|
93
|
+
enter(element, mode = 'overlay') {
|
|
94
|
+
if (!element || this.isFullscreenState()) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (mode === 'browser') {
|
|
98
|
+
this.enterBrowser(element);
|
|
99
|
+
return;
|
|
39
100
|
}
|
|
101
|
+
this.enterOverlay(element);
|
|
40
102
|
}
|
|
41
103
|
/**
|
|
42
|
-
*
|
|
104
|
+
* Exit fullscreen mode.
|
|
43
105
|
*/
|
|
44
|
-
|
|
45
|
-
if (this.isFullscreenState())
|
|
106
|
+
exit(element) {
|
|
107
|
+
if (!this.isFullscreenState()) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const activeElement = this.activeElementState();
|
|
111
|
+
const targetElement = element ?? activeElement;
|
|
112
|
+
if (!targetElement || activeElement !== targetElement) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (this.currentMode === 'browser') {
|
|
116
|
+
this.exitBrowser(targetElement);
|
|
46
117
|
return;
|
|
118
|
+
}
|
|
119
|
+
this.exitOverlay(targetElement);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check whether any element is in fullscreen mode.
|
|
123
|
+
*/
|
|
124
|
+
isFullscreen() {
|
|
125
|
+
return this.isFullscreenState();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check whether the given element is the active fullscreen element.
|
|
129
|
+
*/
|
|
130
|
+
isActive(element) {
|
|
131
|
+
return this.activeElementState() === element && this.isFullscreenState();
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Returns the currently active fullscreen element, if any.
|
|
135
|
+
*/
|
|
136
|
+
getActiveElement() {
|
|
137
|
+
return this.activeElementState();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Returns the active fullscreen mode, if any.
|
|
141
|
+
*/
|
|
142
|
+
getActiveMode() {
|
|
143
|
+
return this.currentMode;
|
|
144
|
+
}
|
|
145
|
+
enterOverlay(element) {
|
|
146
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
47
149
|
try {
|
|
48
|
-
// Store original styles & parent
|
|
49
150
|
this.storeOriginalStyles(element);
|
|
50
151
|
this.originalParent = element.parentElement;
|
|
51
|
-
// Acquire z-index token
|
|
52
152
|
this.zToken = this.zIndexService.acquire();
|
|
53
|
-
|
|
54
|
-
const container = document.createElement('div');
|
|
153
|
+
const container = this.document.createElement('div');
|
|
55
154
|
container.style.position = 'fixed';
|
|
56
155
|
container.style.top = '0';
|
|
57
156
|
container.style.left = '0';
|
|
58
157
|
container.style.width = '100vw';
|
|
59
158
|
container.style.height = '100vh';
|
|
60
159
|
container.style.zIndex = String(this.zToken.zIndex);
|
|
160
|
+
container.style.backgroundColor = '#ffffff';
|
|
61
161
|
container.style.overflow = 'auto';
|
|
62
|
-
// Move element into container
|
|
63
162
|
container.appendChild(element);
|
|
64
|
-
// Apply fullscreen styles to element
|
|
65
163
|
element.style.position = 'relative';
|
|
66
164
|
element.style.width = '100%';
|
|
67
165
|
element.style.height = '100%';
|
|
68
166
|
element.style.margin = '0';
|
|
69
167
|
element.style.padding = '0';
|
|
70
|
-
|
|
71
|
-
document.body.
|
|
72
|
-
// Prevent body scroll
|
|
73
|
-
document.body.style.overflow = 'hidden';
|
|
168
|
+
this.document.body.appendChild(container);
|
|
169
|
+
this.document.body.style.overflow = 'hidden';
|
|
74
170
|
this.fullscreenContainer = container;
|
|
171
|
+
this.currentMode = 'overlay';
|
|
172
|
+
this.activeElementState.set(element);
|
|
75
173
|
this.isFullscreenState.set(true);
|
|
76
174
|
}
|
|
77
175
|
catch (error) {
|
|
78
|
-
console.error('Error entering fullscreen:', error);
|
|
176
|
+
console.error('Error entering overlay fullscreen:', error);
|
|
79
177
|
this.restoreOriginalStyles(element);
|
|
178
|
+
this.cleanupOverlayResources();
|
|
80
179
|
}
|
|
81
180
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
*/
|
|
85
|
-
exit(element) {
|
|
86
|
-
if (!this.isFullscreenState())
|
|
181
|
+
exitOverlay(element) {
|
|
182
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
87
183
|
return;
|
|
184
|
+
}
|
|
88
185
|
try {
|
|
89
|
-
document.body.style.overflow = '';
|
|
186
|
+
this.document.body.style.overflow = '';
|
|
90
187
|
if (this.fullscreenContainer) {
|
|
91
188
|
if (element.parentElement === this.fullscreenContainer) {
|
|
92
189
|
this.fullscreenContainer.removeChild(element);
|
|
@@ -94,35 +191,94 @@ class AXFullScreenService {
|
|
|
94
191
|
if (this.originalParent?.isConnected && !this.originalParent.contains(element)) {
|
|
95
192
|
this.originalParent.appendChild(element);
|
|
96
193
|
}
|
|
97
|
-
if (this.fullscreenContainer.parentNode === document.body) {
|
|
98
|
-
document.body.removeChild(this.fullscreenContainer);
|
|
194
|
+
if (this.fullscreenContainer.parentNode === this.document.body) {
|
|
195
|
+
this.document.body.removeChild(this.fullscreenContainer);
|
|
99
196
|
}
|
|
100
197
|
}
|
|
101
|
-
this.fullscreenContainer = null;
|
|
102
|
-
this.originalParent = null;
|
|
103
|
-
this.zIndexService.release(this.zToken);
|
|
104
|
-
this.zToken = null;
|
|
105
198
|
this.restoreOriginalStyles(element);
|
|
106
|
-
this.
|
|
199
|
+
this.cleanupOverlayResources();
|
|
200
|
+
this.clearActiveState();
|
|
107
201
|
}
|
|
108
202
|
catch (error) {
|
|
109
|
-
console.error('Error exiting fullscreen:', error);
|
|
110
|
-
this.
|
|
111
|
-
this.
|
|
112
|
-
this.zIndexService.release(this.zToken);
|
|
113
|
-
this.zToken = null;
|
|
114
|
-
this.isFullscreenState.set(false);
|
|
203
|
+
console.error('Error exiting overlay fullscreen:', error);
|
|
204
|
+
this.cleanupOverlayResources();
|
|
205
|
+
this.clearActiveState();
|
|
115
206
|
}
|
|
116
207
|
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
208
|
+
enterBrowser(element) {
|
|
209
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
const requestFullscreen = this.getRequestFullscreen(element);
|
|
213
|
+
if (!requestFullscreen) {
|
|
214
|
+
console.error('Browser fullscreen API is not supported in this environment.');
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
void requestFullscreen()
|
|
218
|
+
.then(() => {
|
|
219
|
+
if (this.getFullscreenElement() !== element) {
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
this.currentMode = 'browser';
|
|
223
|
+
this.activeElementState.set(element);
|
|
224
|
+
this.isFullscreenState.set(true);
|
|
225
|
+
})
|
|
226
|
+
.catch((error) => {
|
|
227
|
+
console.error('Error entering browser fullscreen:', error);
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
exitBrowser(element) {
|
|
231
|
+
if (!isPlatformBrowser(this.platformId)) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const fullscreenElement = this.getFullscreenElement();
|
|
235
|
+
if (fullscreenElement === element) {
|
|
236
|
+
const exitFullscreen = this.getExitFullscreen();
|
|
237
|
+
if (exitFullscreen) {
|
|
238
|
+
void exitFullscreen().catch((error) => {
|
|
239
|
+
console.error('Error exiting browser fullscreen:', error);
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
this.clearBrowserState();
|
|
244
|
+
}
|
|
245
|
+
clearBrowserState() {
|
|
246
|
+
this.clearActiveState();
|
|
247
|
+
}
|
|
248
|
+
clearActiveState() {
|
|
249
|
+
this.currentMode = null;
|
|
250
|
+
this.activeElementState.set(null);
|
|
251
|
+
this.isFullscreenState.set(false);
|
|
252
|
+
}
|
|
253
|
+
cleanupOverlayResources() {
|
|
254
|
+
this.fullscreenContainer = null;
|
|
255
|
+
this.originalParent = null;
|
|
256
|
+
this.zIndexService.release(this.zToken);
|
|
257
|
+
this.zToken = null;
|
|
258
|
+
this.originalStyles = {};
|
|
259
|
+
}
|
|
260
|
+
getFullscreenElement() {
|
|
261
|
+
return this.document.fullscreenElement ?? this.document.webkitFullscreenElement ?? null;
|
|
262
|
+
}
|
|
263
|
+
getRequestFullscreen(element) {
|
|
264
|
+
const target = element;
|
|
265
|
+
if (typeof target.requestFullscreen === 'function') {
|
|
266
|
+
return () => target.requestFullscreen();
|
|
267
|
+
}
|
|
268
|
+
if (typeof target.webkitRequestFullscreen === 'function') {
|
|
269
|
+
return () => target.webkitRequestFullscreen();
|
|
270
|
+
}
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
getExitFullscreen() {
|
|
274
|
+
if (typeof this.document.exitFullscreen === 'function') {
|
|
275
|
+
return () => this.document.exitFullscreen();
|
|
276
|
+
}
|
|
277
|
+
if (typeof this.document.webkitExitFullscreen === 'function') {
|
|
278
|
+
return () => this.document.webkitExitFullscreen();
|
|
279
|
+
}
|
|
280
|
+
return null;
|
|
122
281
|
}
|
|
123
|
-
/**
|
|
124
|
-
* Store original computed styles
|
|
125
|
-
*/
|
|
126
282
|
storeOriginalStyles(element) {
|
|
127
283
|
const computed = window.getComputedStyle(element);
|
|
128
284
|
this.originalStyles = {
|
|
@@ -137,15 +293,14 @@ class AXFullScreenService {
|
|
|
137
293
|
padding: computed.padding,
|
|
138
294
|
};
|
|
139
295
|
}
|
|
140
|
-
/**
|
|
141
|
-
* Restore original styles
|
|
142
|
-
*/
|
|
143
296
|
restoreOriginalStyles(element) {
|
|
144
297
|
Object.entries(this.originalStyles).forEach(([key, value]) => {
|
|
145
298
|
if (value) {
|
|
299
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
146
300
|
element.style[key] = value;
|
|
147
301
|
}
|
|
148
302
|
else {
|
|
303
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
149
304
|
element.style[key] = '';
|
|
150
305
|
}
|
|
151
306
|
});
|
|
@@ -159,7 +314,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
159
314
|
args: [{
|
|
160
315
|
providedIn: 'root',
|
|
161
316
|
}]
|
|
162
|
-
}] });
|
|
317
|
+
}], ctorParameters: () => [] });
|
|
163
318
|
|
|
164
319
|
/**
|
|
165
320
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acorex-core-full-screen.mjs","sources":["../../../../packages/core/full-screen/src/lib/full-screen.service.ts","../../../../packages/core/full-screen/src/acorex-core-full-screen.ts"],"sourcesContent":["import { AXZIndexService, AXZToken } from '@acorex/core/z-index';\nimport { inject, Injectable, signal } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXFullScreenService {\n private readonly zIndexService = inject(AXZIndexService);\n\n /**\n * Current fullscreen state\n */\n private readonly isFullscreenState = signal<boolean>(false);\n\n /**\n * Original element styles to restore\n */\n private originalStyles: Partial<CSSStyleDeclaration> = {};\n\n /**\n * Original parent element reference\n */\n private originalParent: HTMLElement | null = null;\n\n /**\n * Fullscreen container element\n */\n private fullscreenContainer: HTMLElement | null = null;\n\n /**\n * Z-index token for this fullscreen instance\n */\n private zToken: AXZToken | null = null;\n\n /**\n * Toggle fullscreen state\n */\n toggle(element: HTMLElement): void {\n if (this.isFullscreenState()) {\n this.exit(element);\n } else {\n this.enter(element);\n }\n }\n\n /**\n * Enter fullscreen mode\n */\n enter(element: HTMLElement): void {\n if (this.isFullscreenState()) return;\n\n try {\n // Store original styles & parent\n this.storeOriginalStyles(element);\n this.originalParent = element.parentElement;\n\n // Acquire z-index token\n this.zToken = this.zIndexService.acquire();\n\n // Create fullscreen container\n const container = document.createElement('div');\n container.style.position = 'fixed';\n container.style.top = '0';\n container.style.left = '0';\n container.style.width = '100vw';\n container.style.height = '100vh';\n container.style.zIndex = String(this.zToken.zIndex);\n container.style.overflow = 'auto';\n\n // Move element into container\n container.appendChild(element);\n\n // Apply fullscreen styles to element\n element.style.position = 'relative';\n element.style.width = '100%';\n element.style.height = '100%';\n element.style.margin = '0';\n element.style.padding = '0';\n\n // Append container to body\n document.body.appendChild(container);\n\n // Prevent body scroll\n document.body.style.overflow = 'hidden';\n\n this.fullscreenContainer = container;\n this.isFullscreenState.set(true);\n } catch (error) {\n console.error('Error entering fullscreen:', error);\n this.restoreOriginalStyles(element);\n }\n }\n\n /**\n * Exit fullscreen mode\n */\n exit(element: HTMLElement): void {\n if (!this.isFullscreenState()) return;\n\n try {\n document.body.style.overflow = '';\n\n if (this.fullscreenContainer) {\n if (element.parentElement === this.fullscreenContainer) {\n this.fullscreenContainer.removeChild(element);\n }\n\n if (this.originalParent?.isConnected && !this.originalParent.contains(element)) {\n this.originalParent.appendChild(element);\n }\n\n if (this.fullscreenContainer.parentNode === document.body) {\n document.body.removeChild(this.fullscreenContainer);\n }\n }\n\n this.fullscreenContainer = null;\n this.originalParent = null;\n\n this.zIndexService.release(this.zToken);\n this.zToken = null;\n\n this.restoreOriginalStyles(element);\n this.isFullscreenState.set(false);\n } catch (error) {\n console.error('Error exiting fullscreen:', error);\n this.fullscreenContainer = null;\n this.originalParent = null;\n this.zIndexService.release(this.zToken);\n this.zToken = null;\n this.isFullscreenState.set(false);\n }\n }\n\n /**\n * Check fullscreen state\n */\n isFullscreen(): boolean {\n return this.isFullscreenState();\n }\n\n /**\n * Store original computed styles\n */\n private storeOriginalStyles(element: HTMLElement): void {\n const computed = window.getComputedStyle(element);\n\n this.originalStyles = {\n position: computed.position,\n top: computed.top,\n left: computed.left,\n width: computed.width,\n height: computed.height,\n zIndex: computed.zIndex,\n backgroundColor: computed.backgroundColor,\n margin: computed.margin,\n padding: computed.padding,\n };\n }\n\n /**\n * Restore original styles\n */\n private restoreOriginalStyles(element: HTMLElement): void {\n Object.entries(this.originalStyles).forEach(([key, value]) => {\n if (value) {\n (element.style as any)[key] = value;\n } else {\n (element.style as any)[key] = '';\n }\n });\n\n this.originalStyles = {};\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"acorex-core-full-screen.mjs","sources":["../../../../packages/core/full-screen/src/lib/full-screen.service.ts","../../../../packages/core/full-screen/src/acorex-core-full-screen.ts"],"sourcesContent":["import { AXZIndexService, AXZToken } from '@acorex/core/z-index';\nimport { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport { DestroyRef, inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\n\n/**\n * Fullscreen implementation mode.\n * - `overlay`: CSS fixed container that covers the viewport.\n * - `browser`: Native Fullscreen API via `element.requestFullscreen()`.\n */\nexport type AXFullScreenMode = 'overlay' | 'browser';\n\ntype FullscreenCapableElement = HTMLElement & {\n requestFullscreen?: () => Promise<void>;\n webkitRequestFullscreen?: () => Promise<void>;\n};\n\ntype FullscreenCapableDocument = Document & {\n exitFullscreen?: () => Promise<void>;\n webkitExitFullscreen?: () => Promise<void>;\n fullscreenElement?: Element | null;\n webkitFullscreenElement?: Element | null;\n};\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AXFullScreenService {\n private readonly zIndexService = inject(AXZIndexService);\n private readonly document = inject(DOCUMENT) as FullscreenCapableDocument;\n private readonly platformId = inject(PLATFORM_ID);\n private readonly destroyRef = inject(DestroyRef);\n\n /**\n * Current fullscreen state.\n */\n private readonly isFullscreenState = signal<boolean>(false);\n\n /**\n * Active fullscreen element.\n */\n private readonly activeElementState = signal<HTMLElement | null>(null);\n\n /**\n * Active fullscreen mode.\n */\n private currentMode: AXFullScreenMode | null = null;\n\n /**\n * Original element styles to restore (overlay mode).\n */\n private originalStyles: Partial<CSSStyleDeclaration> = {};\n\n /**\n * Original parent element reference (overlay mode).\n */\n private originalParent: HTMLElement | null = null;\n\n /**\n * Fullscreen container element (overlay mode).\n */\n private fullscreenContainer: HTMLElement | null = null;\n\n /**\n * Z-index token for overlay fullscreen.\n */\n private zToken: AXZToken | null = null;\n\n private readonly fullscreenChangeHandler = () => {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n if (this.currentMode !== 'browser') {\n return;\n }\n\n const activeElement = this.activeElementState();\n if (!activeElement) {\n return;\n }\n\n const fullscreenElement = this.getFullscreenElement();\n if (fullscreenElement !== activeElement) {\n this.clearBrowserState();\n }\n };\n\n constructor() {\n if (isPlatformBrowser(this.platformId)) {\n this.document.addEventListener('fullscreenchange', this.fullscreenChangeHandler);\n this.document.addEventListener('webkitfullscreenchange', this.fullscreenChangeHandler);\n\n this.destroyRef.onDestroy(() => {\n this.document.removeEventListener('fullscreenchange', this.fullscreenChangeHandler);\n this.document.removeEventListener('webkitfullscreenchange', this.fullscreenChangeHandler);\n\n const activeElement = this.activeElementState();\n if (activeElement) {\n this.exit(activeElement);\n }\n });\n }\n }\n\n /**\n * Toggle fullscreen state.\n */\n toggle(element: HTMLElement, mode: AXFullScreenMode = 'overlay'): void {\n if (this.isActive(element)) {\n this.exit(element);\n } else {\n this.enter(element, mode);\n }\n }\n\n /**\n * Enter fullscreen mode.\n */\n enter(element: HTMLElement, mode: AXFullScreenMode = 'overlay'): void {\n if (!element || this.isFullscreenState()) {\n return;\n }\n\n if (mode === 'browser') {\n this.enterBrowser(element);\n return;\n }\n\n this.enterOverlay(element);\n }\n\n /**\n * Exit fullscreen mode.\n */\n exit(element?: HTMLElement): void {\n if (!this.isFullscreenState()) {\n return;\n }\n\n const activeElement = this.activeElementState();\n const targetElement = element ?? activeElement;\n if (!targetElement || activeElement !== targetElement) {\n return;\n }\n\n if (this.currentMode === 'browser') {\n this.exitBrowser(targetElement);\n return;\n }\n\n this.exitOverlay(targetElement);\n }\n\n /**\n * Check whether any element is in fullscreen mode.\n */\n isFullscreen(): boolean {\n return this.isFullscreenState();\n }\n\n /**\n * Read-only signal of the active fullscreen element.\n */\n readonly activeElement = this.activeElementState.asReadonly();\n\n /**\n * Read-only signal of the fullscreen state.\n */\n readonly fullscreen = this.isFullscreenState.asReadonly();\n\n /**\n * Check whether the given element is the active fullscreen element.\n */\n isActive(element: HTMLElement): boolean {\n return this.activeElementState() === element && this.isFullscreenState();\n }\n\n /**\n * Returns the currently active fullscreen element, if any.\n */\n getActiveElement(): HTMLElement | null {\n return this.activeElementState();\n }\n\n /**\n * Returns the active fullscreen mode, if any.\n */\n getActiveMode(): AXFullScreenMode | null {\n return this.currentMode;\n }\n\n private enterOverlay(element: HTMLElement): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n try {\n this.storeOriginalStyles(element);\n this.originalParent = element.parentElement;\n this.zToken = this.zIndexService.acquire();\n\n const container = this.document.createElement('div');\n container.style.position = 'fixed';\n container.style.top = '0';\n container.style.left = '0';\n container.style.width = '100vw';\n container.style.height = '100vh';\n container.style.zIndex = String(this.zToken.zIndex);\n container.style.backgroundColor = '#ffffff';\n container.style.overflow = 'auto';\n\n container.appendChild(element);\n\n element.style.position = 'relative';\n element.style.width = '100%';\n element.style.height = '100%';\n element.style.margin = '0';\n element.style.padding = '0';\n\n this.document.body.appendChild(container);\n this.document.body.style.overflow = 'hidden';\n\n this.fullscreenContainer = container;\n this.currentMode = 'overlay';\n this.activeElementState.set(element);\n this.isFullscreenState.set(true);\n } catch (error) {\n console.error('Error entering overlay fullscreen:', error);\n this.restoreOriginalStyles(element);\n this.cleanupOverlayResources();\n }\n }\n\n private exitOverlay(element: HTMLElement): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n try {\n this.document.body.style.overflow = '';\n\n if (this.fullscreenContainer) {\n if (element.parentElement === this.fullscreenContainer) {\n this.fullscreenContainer.removeChild(element);\n }\n\n if (this.originalParent?.isConnected && !this.originalParent.contains(element)) {\n this.originalParent.appendChild(element);\n }\n\n if (this.fullscreenContainer.parentNode === this.document.body) {\n this.document.body.removeChild(this.fullscreenContainer);\n }\n }\n\n this.restoreOriginalStyles(element);\n this.cleanupOverlayResources();\n this.clearActiveState();\n } catch (error) {\n console.error('Error exiting overlay fullscreen:', error);\n this.cleanupOverlayResources();\n this.clearActiveState();\n }\n }\n\n private enterBrowser(element: HTMLElement): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const requestFullscreen = this.getRequestFullscreen(element);\n if (!requestFullscreen) {\n console.error('Browser fullscreen API is not supported in this environment.');\n return;\n }\n\n void requestFullscreen()\n .then(() => {\n if (this.getFullscreenElement() !== element) {\n return;\n }\n\n this.currentMode = 'browser';\n this.activeElementState.set(element);\n this.isFullscreenState.set(true);\n })\n .catch((error: unknown) => {\n console.error('Error entering browser fullscreen:', error);\n });\n }\n\n private exitBrowser(element: HTMLElement): void {\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n const fullscreenElement = this.getFullscreenElement();\n if (fullscreenElement === element) {\n const exitFullscreen = this.getExitFullscreen();\n if (exitFullscreen) {\n void exitFullscreen().catch((error: unknown) => {\n console.error('Error exiting browser fullscreen:', error);\n });\n }\n }\n\n this.clearBrowserState();\n }\n\n private clearBrowserState(): void {\n this.clearActiveState();\n }\n\n private clearActiveState(): void {\n this.currentMode = null;\n this.activeElementState.set(null);\n this.isFullscreenState.set(false);\n }\n\n private cleanupOverlayResources(): void {\n this.fullscreenContainer = null;\n this.originalParent = null;\n this.zIndexService.release(this.zToken);\n this.zToken = null;\n this.originalStyles = {};\n }\n\n private getFullscreenElement(): Element | null {\n return this.document.fullscreenElement ?? this.document.webkitFullscreenElement ?? null;\n }\n\n private getRequestFullscreen(element: HTMLElement): (() => Promise<void>) | null {\n const target = element as FullscreenCapableElement;\n if (typeof target.requestFullscreen === 'function') {\n return () => target.requestFullscreen!();\n }\n if (typeof target.webkitRequestFullscreen === 'function') {\n return () => target.webkitRequestFullscreen!();\n }\n return null;\n }\n\n private getExitFullscreen(): (() => Promise<void>) | null {\n if (typeof this.document.exitFullscreen === 'function') {\n return () => this.document.exitFullscreen!();\n }\n if (typeof this.document.webkitExitFullscreen === 'function') {\n return () => this.document.webkitExitFullscreen!();\n }\n return null;\n }\n\n private storeOriginalStyles(element: HTMLElement): void {\n const computed = window.getComputedStyle(element);\n\n this.originalStyles = {\n position: computed.position,\n top: computed.top,\n left: computed.left,\n width: computed.width,\n height: computed.height,\n zIndex: computed.zIndex,\n backgroundColor: computed.backgroundColor,\n margin: computed.margin,\n padding: computed.padding,\n };\n }\n\n private restoreOriginalStyles(element: HTMLElement): void {\n Object.entries(this.originalStyles).forEach(([key, value]) => {\n if (value) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (element.style as any)[key] = value;\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (element.style as any)[key] = '';\n }\n });\n\n this.originalStyles = {};\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,53 +1,97 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
2
|
|
|
3
|
+
/**
|
|
4
|
+
* Fullscreen implementation mode.
|
|
5
|
+
* - `overlay`: CSS fixed container that covers the viewport.
|
|
6
|
+
* - `browser`: Native Fullscreen API via `element.requestFullscreen()`.
|
|
7
|
+
*/
|
|
8
|
+
type AXFullScreenMode = 'overlay' | 'browser';
|
|
3
9
|
declare class AXFullScreenService {
|
|
4
10
|
private readonly zIndexService;
|
|
11
|
+
private readonly document;
|
|
12
|
+
private readonly platformId;
|
|
13
|
+
private readonly destroyRef;
|
|
5
14
|
/**
|
|
6
|
-
* Current fullscreen state
|
|
15
|
+
* Current fullscreen state.
|
|
7
16
|
*/
|
|
8
17
|
private readonly isFullscreenState;
|
|
9
18
|
/**
|
|
10
|
-
*
|
|
19
|
+
* Active fullscreen element.
|
|
20
|
+
*/
|
|
21
|
+
private readonly activeElementState;
|
|
22
|
+
/**
|
|
23
|
+
* Active fullscreen mode.
|
|
24
|
+
*/
|
|
25
|
+
private currentMode;
|
|
26
|
+
/**
|
|
27
|
+
* Original element styles to restore (overlay mode).
|
|
11
28
|
*/
|
|
12
29
|
private originalStyles;
|
|
13
30
|
/**
|
|
14
|
-
* Original parent element reference
|
|
31
|
+
* Original parent element reference (overlay mode).
|
|
15
32
|
*/
|
|
16
33
|
private originalParent;
|
|
17
34
|
/**
|
|
18
|
-
* Fullscreen container element
|
|
35
|
+
* Fullscreen container element (overlay mode).
|
|
19
36
|
*/
|
|
20
37
|
private fullscreenContainer;
|
|
21
38
|
/**
|
|
22
|
-
* Z-index token for
|
|
39
|
+
* Z-index token for overlay fullscreen.
|
|
23
40
|
*/
|
|
24
41
|
private zToken;
|
|
42
|
+
private readonly fullscreenChangeHandler;
|
|
43
|
+
constructor();
|
|
25
44
|
/**
|
|
26
|
-
* Toggle fullscreen state
|
|
45
|
+
* Toggle fullscreen state.
|
|
27
46
|
*/
|
|
28
|
-
toggle(element: HTMLElement): void;
|
|
47
|
+
toggle(element: HTMLElement, mode?: AXFullScreenMode): void;
|
|
29
48
|
/**
|
|
30
|
-
* Enter fullscreen mode
|
|
49
|
+
* Enter fullscreen mode.
|
|
31
50
|
*/
|
|
32
|
-
enter(element: HTMLElement): void;
|
|
51
|
+
enter(element: HTMLElement, mode?: AXFullScreenMode): void;
|
|
33
52
|
/**
|
|
34
|
-
* Exit fullscreen mode
|
|
53
|
+
* Exit fullscreen mode.
|
|
35
54
|
*/
|
|
36
|
-
exit(element
|
|
55
|
+
exit(element?: HTMLElement): void;
|
|
37
56
|
/**
|
|
38
|
-
* Check fullscreen
|
|
57
|
+
* Check whether any element is in fullscreen mode.
|
|
39
58
|
*/
|
|
40
59
|
isFullscreen(): boolean;
|
|
41
60
|
/**
|
|
42
|
-
*
|
|
61
|
+
* Read-only signal of the active fullscreen element.
|
|
43
62
|
*/
|
|
44
|
-
|
|
63
|
+
readonly activeElement: _angular_core.Signal<HTMLElement>;
|
|
64
|
+
/**
|
|
65
|
+
* Read-only signal of the fullscreen state.
|
|
66
|
+
*/
|
|
67
|
+
readonly fullscreen: _angular_core.Signal<boolean>;
|
|
68
|
+
/**
|
|
69
|
+
* Check whether the given element is the active fullscreen element.
|
|
70
|
+
*/
|
|
71
|
+
isActive(element: HTMLElement): boolean;
|
|
45
72
|
/**
|
|
46
|
-
*
|
|
73
|
+
* Returns the currently active fullscreen element, if any.
|
|
47
74
|
*/
|
|
75
|
+
getActiveElement(): HTMLElement | null;
|
|
76
|
+
/**
|
|
77
|
+
* Returns the active fullscreen mode, if any.
|
|
78
|
+
*/
|
|
79
|
+
getActiveMode(): AXFullScreenMode | null;
|
|
80
|
+
private enterOverlay;
|
|
81
|
+
private exitOverlay;
|
|
82
|
+
private enterBrowser;
|
|
83
|
+
private exitBrowser;
|
|
84
|
+
private clearBrowserState;
|
|
85
|
+
private clearActiveState;
|
|
86
|
+
private cleanupOverlayResources;
|
|
87
|
+
private getFullscreenElement;
|
|
88
|
+
private getRequestFullscreen;
|
|
89
|
+
private getExitFullscreen;
|
|
90
|
+
private storeOriginalStyles;
|
|
48
91
|
private restoreOriginalStyles;
|
|
49
|
-
static ɵfac:
|
|
50
|
-
static ɵprov:
|
|
92
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<AXFullScreenService, never>;
|
|
93
|
+
static ɵprov: _angular_core.ɵɵInjectableDeclaration<AXFullScreenService>;
|
|
51
94
|
}
|
|
52
95
|
|
|
53
96
|
export { AXFullScreenService };
|
|
97
|
+
export type { AXFullScreenMode };
|