@angular/cdk 19.0.0-next.9 → 19.0.0-rc.0
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/fesm2022/a11y.mjs +313 -266
- package/fesm2022/a11y.mjs.map +1 -1
- package/fesm2022/accordion.mjs +41 -44
- package/fesm2022/accordion.mjs.map +1 -1
- package/fesm2022/bidi.mjs +19 -19
- package/fesm2022/bidi.mjs.map +1 -1
- package/fesm2022/cdk.mjs +1 -1
- package/fesm2022/cdk.mjs.map +1 -1
- package/fesm2022/clipboard.mjs +31 -26
- package/fesm2022/clipboard.mjs.map +1 -1
- package/fesm2022/collections.mjs +30 -28
- package/fesm2022/collections.mjs.map +1 -1
- package/fesm2022/dialog.mjs +210 -131
- package/fesm2022/dialog.mjs.map +1 -1
- package/fesm2022/drag-drop.mjs +721 -477
- package/fesm2022/drag-drop.mjs.map +1 -1
- package/fesm2022/layout.mjs +18 -17
- package/fesm2022/layout.mjs.map +1 -1
- package/fesm2022/listbox.mjs +76 -62
- package/fesm2022/listbox.mjs.map +1 -1
- package/fesm2022/menu.mjs +231 -203
- package/fesm2022/menu.mjs.map +1 -1
- package/fesm2022/observers/private.mjs +15 -12
- package/fesm2022/observers/private.mjs.map +1 -1
- package/fesm2022/observers.mjs +22 -23
- package/fesm2022/observers.mjs.map +1 -1
- package/fesm2022/overlay.mjs +410 -278
- package/fesm2022/overlay.mjs.map +1 -1
- package/fesm2022/platform.mjs +49 -50
- package/fesm2022/platform.mjs.map +1 -1
- package/fesm2022/portal.mjs +110 -74
- package/fesm2022/portal.mjs.map +1 -1
- package/fesm2022/private.mjs +7 -8
- package/fesm2022/private.mjs.map +1 -1
- package/fesm2022/scrolling.mjs +179 -158
- package/fesm2022/scrolling.mjs.map +1 -1
- package/fesm2022/stepper.mjs +97 -65
- package/fesm2022/stepper.mjs.map +1 -1
- package/fesm2022/table.mjs +443 -232
- package/fesm2022/table.mjs.map +1 -1
- package/fesm2022/testing/selenium-webdriver.mjs +6 -0
- package/fesm2022/testing/selenium-webdriver.mjs.map +1 -1
- package/fesm2022/testing/testbed.mjs +16 -7
- package/fesm2022/testing/testbed.mjs.map +1 -1
- package/fesm2022/testing.mjs +7 -2
- package/fesm2022/testing.mjs.map +1 -1
- package/fesm2022/text-field.mjs +50 -41
- package/fesm2022/text-field.mjs.map +1 -1
- package/fesm2022/tree.mjs +220 -118
- package/fesm2022/tree.mjs.map +1 -1
- package/package.json +1 -1
- package/schematics/ng-add/index.js +1 -1
- package/schematics/ng-add/index.mjs +1 -1
- package/table/index.d.ts +20 -1
package/fesm2022/platform.mjs
CHANGED
|
@@ -21,53 +21,52 @@ catch {
|
|
|
21
21
|
* checking browser-specific global properties.
|
|
22
22
|
*/
|
|
23
23
|
class Platform {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
static
|
|
70
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Platform, providedIn: 'root' }); }
|
|
24
|
+
_platformId = inject(PLATFORM_ID);
|
|
25
|
+
// We want to use the Angular platform check because if the Document is shimmed
|
|
26
|
+
// without the navigator, the following checks will fail. This is preferred because
|
|
27
|
+
// sometimes the Document may be shimmed without the user's knowledge or intention
|
|
28
|
+
/** Whether the Angular application is being rendered in the browser. */
|
|
29
|
+
isBrowser = this._platformId
|
|
30
|
+
? isPlatformBrowser(this._platformId)
|
|
31
|
+
: typeof document === 'object' && !!document;
|
|
32
|
+
/** Whether the current browser is Microsoft Edge. */
|
|
33
|
+
EDGE = this.isBrowser && /(edge)/i.test(navigator.userAgent);
|
|
34
|
+
/** Whether the current rendering engine is Microsoft Trident. */
|
|
35
|
+
TRIDENT = this.isBrowser && /(msie|trident)/i.test(navigator.userAgent);
|
|
36
|
+
// EdgeHTML and Trident mock Blink specific things and need to be excluded from this check.
|
|
37
|
+
/** Whether the current rendering engine is Blink. */
|
|
38
|
+
BLINK = this.isBrowser &&
|
|
39
|
+
!!(window.chrome || hasV8BreakIterator) &&
|
|
40
|
+
typeof CSS !== 'undefined' &&
|
|
41
|
+
!this.EDGE &&
|
|
42
|
+
!this.TRIDENT;
|
|
43
|
+
// Webkit is part of the userAgent in EdgeHTML, Blink and Trident. Therefore we need to
|
|
44
|
+
// ensure that Webkit runs standalone and is not used as another engine's base.
|
|
45
|
+
/** Whether the current rendering engine is WebKit. */
|
|
46
|
+
WEBKIT = this.isBrowser &&
|
|
47
|
+
/AppleWebKit/i.test(navigator.userAgent) &&
|
|
48
|
+
!this.BLINK &&
|
|
49
|
+
!this.EDGE &&
|
|
50
|
+
!this.TRIDENT;
|
|
51
|
+
/** Whether the current platform is Apple iOS. */
|
|
52
|
+
IOS = this.isBrowser && /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window);
|
|
53
|
+
// It's difficult to detect the plain Gecko engine, because most of the browsers identify
|
|
54
|
+
// them self as Gecko-like browsers and modify the userAgent's according to that.
|
|
55
|
+
// Since we only cover one explicit Firefox case, we can simply check for Firefox
|
|
56
|
+
// instead of having an unstable check for Gecko.
|
|
57
|
+
/** Whether the current browser is Firefox. */
|
|
58
|
+
FIREFOX = this.isBrowser && /(firefox|minefield)/i.test(navigator.userAgent);
|
|
59
|
+
/** Whether the current platform is Android. */
|
|
60
|
+
// Trident on mobile adds the android platform to the userAgent to trick detections.
|
|
61
|
+
ANDROID = this.isBrowser && /android/i.test(navigator.userAgent) && !this.TRIDENT;
|
|
62
|
+
// Safari browsers will include the Safari keyword in their userAgent. Some browsers may fake
|
|
63
|
+
// this and just place the Safari keyword in the userAgent. To be more safe about Safari every
|
|
64
|
+
// Safari browser should also use Webkit as its layout engine.
|
|
65
|
+
/** Whether the current browser is Safari. */
|
|
66
|
+
SAFARI = this.isBrowser && /safari/i.test(navigator.userAgent) && this.WEBKIT;
|
|
67
|
+
constructor() { }
|
|
68
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Platform, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
69
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Platform, providedIn: 'root' });
|
|
71
70
|
}
|
|
72
71
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Platform, decorators: [{
|
|
73
72
|
type: Injectable,
|
|
@@ -75,9 +74,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10",
|
|
|
75
74
|
}], ctorParameters: () => [] });
|
|
76
75
|
|
|
77
76
|
class PlatformModule {
|
|
78
|
-
static
|
|
79
|
-
static
|
|
80
|
-
static
|
|
77
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: PlatformModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
78
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0-next.10", ngImport: i0, type: PlatformModule });
|
|
79
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: PlatformModule });
|
|
81
80
|
}
|
|
82
81
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: PlatformModule, decorators: [{
|
|
83
82
|
type: NgModule,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform.mjs","sources":["../../../../../../src/cdk/platform/platform.ts","../../../../../../src/cdk/platform/platform-module.ts","../../../../../../src/cdk/platform/features/input-types.ts","../../../../../../src/cdk/platform/features/passive-listeners.ts","../../../../../../src/cdk/platform/features/scrolling.ts","../../../../../../src/cdk/platform/features/shadow-dom.ts","../../../../../../src/cdk/platform/features/test-environment.ts","../../../../../../src/cdk/platform/platform_public_index.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {inject, Injectable, PLATFORM_ID} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\n\n// Whether the current platform supports the V8 Break Iterator. The V8 check\n// is necessary to detect all Blink based browsers.\nlet hasV8BreakIterator: boolean;\n\n// We need a try/catch around the reference to `Intl`, because accessing it in some cases can\n// cause IE to throw. These cases are tied to particular versions of Windows and can happen if\n// the consumer is providing a polyfilled `Map`. See:\n// https://github.com/Microsoft/ChakraCore/issues/3189\n// https://github.com/angular/components/issues/15687\ntry {\n hasV8BreakIterator = typeof Intl !== 'undefined' && (Intl as any).v8BreakIterator;\n} catch {\n hasV8BreakIterator = false;\n}\n\n/**\n * Service to detect the current platform by comparing the userAgent strings and\n * checking browser-specific global properties.\n */\n@Injectable({providedIn: 'root'})\nexport class Platform {\n private _platformId = inject(PLATFORM_ID);\n\n // We want to use the Angular platform check because if the Document is shimmed\n // without the navigator, the following checks will fail. This is preferred because\n // sometimes the Document may be shimmed without the user's knowledge or intention\n /** Whether the Angular application is being rendered in the browser. */\n isBrowser: boolean = this._platformId\n ? isPlatformBrowser(this._platformId)\n : typeof document === 'object' && !!document;\n\n /** Whether the current browser is Microsoft Edge. */\n EDGE: boolean = this.isBrowser && /(edge)/i.test(navigator.userAgent);\n\n /** Whether the current rendering engine is Microsoft Trident. */\n TRIDENT: boolean = this.isBrowser && /(msie|trident)/i.test(navigator.userAgent);\n\n // EdgeHTML and Trident mock Blink specific things and need to be excluded from this check.\n /** Whether the current rendering engine is Blink. */\n BLINK: boolean =\n this.isBrowser &&\n !!((window as any).chrome || hasV8BreakIterator) &&\n typeof CSS !== 'undefined' &&\n !this.EDGE &&\n !this.TRIDENT;\n\n // Webkit is part of the userAgent in EdgeHTML, Blink and Trident. Therefore we need to\n // ensure that Webkit runs standalone and is not used as another engine's base.\n /** Whether the current rendering engine is WebKit. */\n WEBKIT: boolean =\n this.isBrowser &&\n /AppleWebKit/i.test(navigator.userAgent) &&\n !this.BLINK &&\n !this.EDGE &&\n !this.TRIDENT;\n\n /** Whether the current platform is Apple iOS. */\n IOS: boolean =\n this.isBrowser && /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window);\n\n // It's difficult to detect the plain Gecko engine, because most of the browsers identify\n // them self as Gecko-like browsers and modify the userAgent's according to that.\n // Since we only cover one explicit Firefox case, we can simply check for Firefox\n // instead of having an unstable check for Gecko.\n /** Whether the current browser is Firefox. */\n FIREFOX: boolean = this.isBrowser && /(firefox|minefield)/i.test(navigator.userAgent);\n\n /** Whether the current platform is Android. */\n // Trident on mobile adds the android platform to the userAgent to trick detections.\n ANDROID: boolean = this.isBrowser && /android/i.test(navigator.userAgent) && !this.TRIDENT;\n\n // Safari browsers will include the Safari keyword in their userAgent. Some browsers may fake\n // this and just place the Safari keyword in the userAgent. To be more safe about Safari every\n // Safari browser should also use Webkit as its layout engine.\n /** Whether the current browser is Safari. */\n SAFARI: boolean = this.isBrowser && /safari/i.test(navigator.userAgent) && this.WEBKIT;\n\n /** Backwards-compatible constructor. */\n constructor(..._args: unknown[]);\n\n constructor() {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NgModule} from '@angular/core';\n\n@NgModule({})\nexport class PlatformModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** Cached result Set of input types support by the current browser. */\nlet supportedInputTypes: Set<string>;\n\n/** Types of `<input>` that *might* be supported. */\nconst candidateInputTypes = [\n // `color` must come first. Chrome 56 shows a warning if we change the type to `color` after\n // first changing it to something else:\n // The specified value \"\" does not conform to the required format.\n // The format is \"#rrggbb\" where rr, gg, bb are two-digit hexadecimal numbers.\n 'color',\n 'button',\n 'checkbox',\n 'date',\n 'datetime-local',\n 'email',\n 'file',\n 'hidden',\n 'image',\n 'month',\n 'number',\n 'password',\n 'radio',\n 'range',\n 'reset',\n 'search',\n 'submit',\n 'tel',\n 'text',\n 'time',\n 'url',\n 'week',\n];\n\n/** @returns The input types supported by this browser. */\nexport function getSupportedInputTypes(): Set<string> {\n // Result is cached.\n if (supportedInputTypes) {\n return supportedInputTypes;\n }\n\n // We can't check if an input type is not supported until we're on the browser, so say that\n // everything is supported when not on the browser. We don't use `Platform` here since it's\n // just a helper function and can't inject it.\n if (typeof document !== 'object' || !document) {\n supportedInputTypes = new Set(candidateInputTypes);\n return supportedInputTypes;\n }\n\n let featureTestInput = document.createElement('input');\n supportedInputTypes = new Set(\n candidateInputTypes.filter(value => {\n featureTestInput.setAttribute('type', value);\n return featureTestInput.type === value;\n }),\n );\n\n return supportedInputTypes;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** Cached result of whether the user's browser supports passive event listeners. */\nlet supportsPassiveEvents: boolean;\n\n/**\n * Checks whether the user's browser supports passive event listeners.\n * See: https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n */\nexport function supportsPassiveEventListeners(): boolean {\n if (supportsPassiveEvents == null && typeof window !== 'undefined') {\n try {\n window.addEventListener(\n 'test',\n null!,\n Object.defineProperty({}, 'passive', {\n get: () => (supportsPassiveEvents = true),\n }),\n );\n } finally {\n supportsPassiveEvents = supportsPassiveEvents || false;\n }\n }\n\n return supportsPassiveEvents;\n}\n\n/**\n * Normalizes an `AddEventListener` object to something that can be passed\n * to `addEventListener` on any browser, no matter whether it supports the\n * `options` parameter.\n * @param options Object to be normalized.\n */\nexport function normalizePassiveListenerOptions(\n options: AddEventListenerOptions,\n): AddEventListenerOptions | boolean {\n return supportsPassiveEventListeners() ? options : !!options.capture;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** The possible ways the browser may handle the horizontal scroll axis in RTL languages. */\nexport enum RtlScrollAxisType {\n /**\n * scrollLeft is 0 when scrolled all the way left and (scrollWidth - clientWidth) when scrolled\n * all the way right.\n */\n NORMAL,\n /**\n * scrollLeft is -(scrollWidth - clientWidth) when scrolled all the way left and 0 when scrolled\n * all the way right.\n */\n NEGATED,\n /**\n * scrollLeft is (scrollWidth - clientWidth) when scrolled all the way left and 0 when scrolled\n * all the way right.\n */\n INVERTED,\n}\n\n/** Cached result of the way the browser handles the horizontal scroll axis in RTL mode. */\nlet rtlScrollAxisType: RtlScrollAxisType | undefined;\n\n/** Cached result of the check that indicates whether the browser supports scroll behaviors. */\nlet scrollBehaviorSupported: boolean | undefined;\n\n/** Check whether the browser supports scroll behaviors. */\nexport function supportsScrollBehavior(): boolean {\n if (scrollBehaviorSupported == null) {\n // If we're not in the browser, it can't be supported. Also check for `Element`, because\n // some projects stub out the global `document` during SSR which can throw us off.\n if (typeof document !== 'object' || !document || typeof Element !== 'function' || !Element) {\n scrollBehaviorSupported = false;\n return scrollBehaviorSupported;\n }\n\n // If the element can have a `scrollBehavior` style, we can be sure that it's supported.\n if ('scrollBehavior' in document.documentElement!.style) {\n scrollBehaviorSupported = true;\n } else {\n // At this point we have 3 possibilities: `scrollTo` isn't supported at all, it's\n // supported but it doesn't handle scroll behavior, or it has been polyfilled.\n const scrollToFunction: Function | undefined = Element.prototype.scrollTo;\n\n if (scrollToFunction) {\n // We can detect if the function has been polyfilled by calling `toString` on it. Native\n // functions are obfuscated using `[native code]`, whereas if it was overwritten we'd get\n // the actual function source. Via https://davidwalsh.name/detect-native-function. Consider\n // polyfilled functions as supporting scroll behavior.\n scrollBehaviorSupported = !/\\{\\s*\\[native code\\]\\s*\\}/.test(scrollToFunction.toString());\n } else {\n scrollBehaviorSupported = false;\n }\n }\n }\n\n return scrollBehaviorSupported;\n}\n\n/**\n * Checks the type of RTL scroll axis used by this browser. As of time of writing, Chrome is NORMAL,\n * Firefox & Safari are NEGATED, and IE & Edge are INVERTED.\n */\nexport function getRtlScrollAxisType(): RtlScrollAxisType {\n // We can't check unless we're on the browser. Just assume 'normal' if we're not.\n if (typeof document !== 'object' || !document) {\n return RtlScrollAxisType.NORMAL;\n }\n\n if (rtlScrollAxisType == null) {\n // Create a 1px wide scrolling container and a 2px wide content element.\n const scrollContainer = document.createElement('div');\n const containerStyle = scrollContainer.style;\n scrollContainer.dir = 'rtl';\n containerStyle.width = '1px';\n containerStyle.overflow = 'auto';\n containerStyle.visibility = 'hidden';\n containerStyle.pointerEvents = 'none';\n containerStyle.position = 'absolute';\n\n const content = document.createElement('div');\n const contentStyle = content.style;\n contentStyle.width = '2px';\n contentStyle.height = '1px';\n\n scrollContainer.appendChild(content);\n document.body.appendChild(scrollContainer);\n\n rtlScrollAxisType = RtlScrollAxisType.NORMAL;\n\n // The viewport starts scrolled all the way to the right in RTL mode. If we are in a NORMAL\n // browser this would mean that the scrollLeft should be 1. If it's zero instead we know we're\n // dealing with one of the other two types of browsers.\n if (scrollContainer.scrollLeft === 0) {\n // In a NEGATED browser the scrollLeft is always somewhere in [-maxScrollAmount, 0]. For an\n // INVERTED browser it is always somewhere in [0, maxScrollAmount]. We can determine which by\n // setting to the scrollLeft to 1. This is past the max for a NEGATED browser, so it will\n // return 0 when we read it again.\n scrollContainer.scrollLeft = 1;\n rtlScrollAxisType =\n scrollContainer.scrollLeft === 0 ? RtlScrollAxisType.NEGATED : RtlScrollAxisType.INVERTED;\n }\n\n scrollContainer.remove();\n }\n return rtlScrollAxisType;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nlet shadowDomIsSupported: boolean;\n\n/** Checks whether the user's browser support Shadow DOM. */\nexport function _supportsShadowDom(): boolean {\n if (shadowDomIsSupported == null) {\n const head = typeof document !== 'undefined' ? document.head : null;\n shadowDomIsSupported = !!(head && ((head as any).createShadowRoot || head.attachShadow));\n }\n\n return shadowDomIsSupported;\n}\n\n/** Gets the shadow root of an element, if supported and the element is inside the Shadow DOM. */\nexport function _getShadowRoot(element: HTMLElement): ShadowRoot | null {\n if (_supportsShadowDom()) {\n const rootNode = element.getRootNode ? element.getRootNode() : null;\n\n // Note that this should be caught by `_supportsShadowDom`, but some\n // teams have been able to hit this code path on unsupported browsers.\n if (typeof ShadowRoot !== 'undefined' && ShadowRoot && rootNode instanceof ShadowRoot) {\n return rootNode;\n }\n }\n\n return null;\n}\n\n/**\n * Gets the currently-focused element on the page while\n * also piercing through Shadow DOM boundaries.\n */\nexport function _getFocusedElementPierceShadowDom(): HTMLElement | null {\n let activeElement =\n typeof document !== 'undefined' && document\n ? (document.activeElement as HTMLElement | null)\n : null;\n\n while (activeElement && activeElement.shadowRoot) {\n const newActiveElement = activeElement.shadowRoot.activeElement as HTMLElement | null;\n if (newActiveElement === activeElement) {\n break;\n } else {\n activeElement = newActiveElement;\n }\n }\n\n return activeElement;\n}\n\n/** Gets the target of an event while accounting for Shadow DOM. */\nexport function _getEventTarget<T extends EventTarget>(event: Event): T | null {\n // If an event is bound outside the Shadow DOM, the `event.target` will\n // point to the shadow root so we have to use `composedPath` instead.\n return (event.composedPath ? event.composedPath()[0] : event.target) as T | null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** Gets whether the code is currently running in a test environment. */\nexport function _isTestEnvironment(): boolean {\n // We can't use `declare const` because it causes conflicts inside Google with the real typings\n // for these symbols and we can't read them off the global object, because they don't appear to\n // be attached there for some runners like Jest.\n // (see: https://github.com/angular/components/issues/23365#issuecomment-938146643)\n return (\n // @ts-ignore\n (typeof __karma__ !== 'undefined' && !!__karma__) ||\n // @ts-ignore\n (typeof jasmine !== 'undefined' && !!jasmine) ||\n // @ts-ignore\n (typeof jest !== 'undefined' && !!jest) ||\n // @ts-ignore\n (typeof Mocha !== 'undefined' && !!Mocha)\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":"platform.mjs","sources":["../../../../../../src/cdk/platform/platform.ts","../../../../../../src/cdk/platform/platform-module.ts","../../../../../../src/cdk/platform/features/input-types.ts","../../../../../../src/cdk/platform/features/passive-listeners.ts","../../../../../../src/cdk/platform/features/scrolling.ts","../../../../../../src/cdk/platform/features/shadow-dom.ts","../../../../../../src/cdk/platform/features/test-environment.ts","../../../../../../src/cdk/platform/platform_public_index.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {inject, Injectable, PLATFORM_ID} from '@angular/core';\nimport {isPlatformBrowser} from '@angular/common';\n\n// Whether the current platform supports the V8 Break Iterator. The V8 check\n// is necessary to detect all Blink based browsers.\nlet hasV8BreakIterator: boolean;\n\n// We need a try/catch around the reference to `Intl`, because accessing it in some cases can\n// cause IE to throw. These cases are tied to particular versions of Windows and can happen if\n// the consumer is providing a polyfilled `Map`. See:\n// https://github.com/Microsoft/ChakraCore/issues/3189\n// https://github.com/angular/components/issues/15687\ntry {\n hasV8BreakIterator = typeof Intl !== 'undefined' && (Intl as any).v8BreakIterator;\n} catch {\n hasV8BreakIterator = false;\n}\n\n/**\n * Service to detect the current platform by comparing the userAgent strings and\n * checking browser-specific global properties.\n */\n@Injectable({providedIn: 'root'})\nexport class Platform {\n private _platformId = inject(PLATFORM_ID);\n\n // We want to use the Angular platform check because if the Document is shimmed\n // without the navigator, the following checks will fail. This is preferred because\n // sometimes the Document may be shimmed without the user's knowledge or intention\n /** Whether the Angular application is being rendered in the browser. */\n isBrowser: boolean = this._platformId\n ? isPlatformBrowser(this._platformId)\n : typeof document === 'object' && !!document;\n\n /** Whether the current browser is Microsoft Edge. */\n EDGE: boolean = this.isBrowser && /(edge)/i.test(navigator.userAgent);\n\n /** Whether the current rendering engine is Microsoft Trident. */\n TRIDENT: boolean = this.isBrowser && /(msie|trident)/i.test(navigator.userAgent);\n\n // EdgeHTML and Trident mock Blink specific things and need to be excluded from this check.\n /** Whether the current rendering engine is Blink. */\n BLINK: boolean =\n this.isBrowser &&\n !!((window as any).chrome || hasV8BreakIterator) &&\n typeof CSS !== 'undefined' &&\n !this.EDGE &&\n !this.TRIDENT;\n\n // Webkit is part of the userAgent in EdgeHTML, Blink and Trident. Therefore we need to\n // ensure that Webkit runs standalone and is not used as another engine's base.\n /** Whether the current rendering engine is WebKit. */\n WEBKIT: boolean =\n this.isBrowser &&\n /AppleWebKit/i.test(navigator.userAgent) &&\n !this.BLINK &&\n !this.EDGE &&\n !this.TRIDENT;\n\n /** Whether the current platform is Apple iOS. */\n IOS: boolean =\n this.isBrowser && /iPad|iPhone|iPod/.test(navigator.userAgent) && !('MSStream' in window);\n\n // It's difficult to detect the plain Gecko engine, because most of the browsers identify\n // them self as Gecko-like browsers and modify the userAgent's according to that.\n // Since we only cover one explicit Firefox case, we can simply check for Firefox\n // instead of having an unstable check for Gecko.\n /** Whether the current browser is Firefox. */\n FIREFOX: boolean = this.isBrowser && /(firefox|minefield)/i.test(navigator.userAgent);\n\n /** Whether the current platform is Android. */\n // Trident on mobile adds the android platform to the userAgent to trick detections.\n ANDROID: boolean = this.isBrowser && /android/i.test(navigator.userAgent) && !this.TRIDENT;\n\n // Safari browsers will include the Safari keyword in their userAgent. Some browsers may fake\n // this and just place the Safari keyword in the userAgent. To be more safe about Safari every\n // Safari browser should also use Webkit as its layout engine.\n /** Whether the current browser is Safari. */\n SAFARI: boolean = this.isBrowser && /safari/i.test(navigator.userAgent) && this.WEBKIT;\n\n /** Backwards-compatible constructor. */\n constructor(..._args: unknown[]);\n\n constructor() {}\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nimport {NgModule} from '@angular/core';\n\n@NgModule({})\nexport class PlatformModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** Cached result Set of input types support by the current browser. */\nlet supportedInputTypes: Set<string>;\n\n/** Types of `<input>` that *might* be supported. */\nconst candidateInputTypes = [\n // `color` must come first. Chrome 56 shows a warning if we change the type to `color` after\n // first changing it to something else:\n // The specified value \"\" does not conform to the required format.\n // The format is \"#rrggbb\" where rr, gg, bb are two-digit hexadecimal numbers.\n 'color',\n 'button',\n 'checkbox',\n 'date',\n 'datetime-local',\n 'email',\n 'file',\n 'hidden',\n 'image',\n 'month',\n 'number',\n 'password',\n 'radio',\n 'range',\n 'reset',\n 'search',\n 'submit',\n 'tel',\n 'text',\n 'time',\n 'url',\n 'week',\n];\n\n/** @returns The input types supported by this browser. */\nexport function getSupportedInputTypes(): Set<string> {\n // Result is cached.\n if (supportedInputTypes) {\n return supportedInputTypes;\n }\n\n // We can't check if an input type is not supported until we're on the browser, so say that\n // everything is supported when not on the browser. We don't use `Platform` here since it's\n // just a helper function and can't inject it.\n if (typeof document !== 'object' || !document) {\n supportedInputTypes = new Set(candidateInputTypes);\n return supportedInputTypes;\n }\n\n let featureTestInput = document.createElement('input');\n supportedInputTypes = new Set(\n candidateInputTypes.filter(value => {\n featureTestInput.setAttribute('type', value);\n return featureTestInput.type === value;\n }),\n );\n\n return supportedInputTypes;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** Cached result of whether the user's browser supports passive event listeners. */\nlet supportsPassiveEvents: boolean;\n\n/**\n * Checks whether the user's browser supports passive event listeners.\n * See: https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n */\nexport function supportsPassiveEventListeners(): boolean {\n if (supportsPassiveEvents == null && typeof window !== 'undefined') {\n try {\n window.addEventListener(\n 'test',\n null!,\n Object.defineProperty({}, 'passive', {\n get: () => (supportsPassiveEvents = true),\n }),\n );\n } finally {\n supportsPassiveEvents = supportsPassiveEvents || false;\n }\n }\n\n return supportsPassiveEvents;\n}\n\n/**\n * Normalizes an `AddEventListener` object to something that can be passed\n * to `addEventListener` on any browser, no matter whether it supports the\n * `options` parameter.\n * @param options Object to be normalized.\n */\nexport function normalizePassiveListenerOptions(\n options: AddEventListenerOptions,\n): AddEventListenerOptions | boolean {\n return supportsPassiveEventListeners() ? options : !!options.capture;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** The possible ways the browser may handle the horizontal scroll axis in RTL languages. */\nexport enum RtlScrollAxisType {\n /**\n * scrollLeft is 0 when scrolled all the way left and (scrollWidth - clientWidth) when scrolled\n * all the way right.\n */\n NORMAL,\n /**\n * scrollLeft is -(scrollWidth - clientWidth) when scrolled all the way left and 0 when scrolled\n * all the way right.\n */\n NEGATED,\n /**\n * scrollLeft is (scrollWidth - clientWidth) when scrolled all the way left and 0 when scrolled\n * all the way right.\n */\n INVERTED,\n}\n\n/** Cached result of the way the browser handles the horizontal scroll axis in RTL mode. */\nlet rtlScrollAxisType: RtlScrollAxisType | undefined;\n\n/** Cached result of the check that indicates whether the browser supports scroll behaviors. */\nlet scrollBehaviorSupported: boolean | undefined;\n\n/** Check whether the browser supports scroll behaviors. */\nexport function supportsScrollBehavior(): boolean {\n if (scrollBehaviorSupported == null) {\n // If we're not in the browser, it can't be supported. Also check for `Element`, because\n // some projects stub out the global `document` during SSR which can throw us off.\n if (typeof document !== 'object' || !document || typeof Element !== 'function' || !Element) {\n scrollBehaviorSupported = false;\n return scrollBehaviorSupported;\n }\n\n // If the element can have a `scrollBehavior` style, we can be sure that it's supported.\n if ('scrollBehavior' in document.documentElement!.style) {\n scrollBehaviorSupported = true;\n } else {\n // At this point we have 3 possibilities: `scrollTo` isn't supported at all, it's\n // supported but it doesn't handle scroll behavior, or it has been polyfilled.\n const scrollToFunction: Function | undefined = Element.prototype.scrollTo;\n\n if (scrollToFunction) {\n // We can detect if the function has been polyfilled by calling `toString` on it. Native\n // functions are obfuscated using `[native code]`, whereas if it was overwritten we'd get\n // the actual function source. Via https://davidwalsh.name/detect-native-function. Consider\n // polyfilled functions as supporting scroll behavior.\n scrollBehaviorSupported = !/\\{\\s*\\[native code\\]\\s*\\}/.test(scrollToFunction.toString());\n } else {\n scrollBehaviorSupported = false;\n }\n }\n }\n\n return scrollBehaviorSupported;\n}\n\n/**\n * Checks the type of RTL scroll axis used by this browser. As of time of writing, Chrome is NORMAL,\n * Firefox & Safari are NEGATED, and IE & Edge are INVERTED.\n */\nexport function getRtlScrollAxisType(): RtlScrollAxisType {\n // We can't check unless we're on the browser. Just assume 'normal' if we're not.\n if (typeof document !== 'object' || !document) {\n return RtlScrollAxisType.NORMAL;\n }\n\n if (rtlScrollAxisType == null) {\n // Create a 1px wide scrolling container and a 2px wide content element.\n const scrollContainer = document.createElement('div');\n const containerStyle = scrollContainer.style;\n scrollContainer.dir = 'rtl';\n containerStyle.width = '1px';\n containerStyle.overflow = 'auto';\n containerStyle.visibility = 'hidden';\n containerStyle.pointerEvents = 'none';\n containerStyle.position = 'absolute';\n\n const content = document.createElement('div');\n const contentStyle = content.style;\n contentStyle.width = '2px';\n contentStyle.height = '1px';\n\n scrollContainer.appendChild(content);\n document.body.appendChild(scrollContainer);\n\n rtlScrollAxisType = RtlScrollAxisType.NORMAL;\n\n // The viewport starts scrolled all the way to the right in RTL mode. If we are in a NORMAL\n // browser this would mean that the scrollLeft should be 1. If it's zero instead we know we're\n // dealing with one of the other two types of browsers.\n if (scrollContainer.scrollLeft === 0) {\n // In a NEGATED browser the scrollLeft is always somewhere in [-maxScrollAmount, 0]. For an\n // INVERTED browser it is always somewhere in [0, maxScrollAmount]. We can determine which by\n // setting to the scrollLeft to 1. This is past the max for a NEGATED browser, so it will\n // return 0 when we read it again.\n scrollContainer.scrollLeft = 1;\n rtlScrollAxisType =\n scrollContainer.scrollLeft === 0 ? RtlScrollAxisType.NEGATED : RtlScrollAxisType.INVERTED;\n }\n\n scrollContainer.remove();\n }\n return rtlScrollAxisType;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\nlet shadowDomIsSupported: boolean;\n\n/** Checks whether the user's browser support Shadow DOM. */\nexport function _supportsShadowDom(): boolean {\n if (shadowDomIsSupported == null) {\n const head = typeof document !== 'undefined' ? document.head : null;\n shadowDomIsSupported = !!(head && ((head as any).createShadowRoot || head.attachShadow));\n }\n\n return shadowDomIsSupported;\n}\n\n/** Gets the shadow root of an element, if supported and the element is inside the Shadow DOM. */\nexport function _getShadowRoot(element: HTMLElement): ShadowRoot | null {\n if (_supportsShadowDom()) {\n const rootNode = element.getRootNode ? element.getRootNode() : null;\n\n // Note that this should be caught by `_supportsShadowDom`, but some\n // teams have been able to hit this code path on unsupported browsers.\n if (typeof ShadowRoot !== 'undefined' && ShadowRoot && rootNode instanceof ShadowRoot) {\n return rootNode;\n }\n }\n\n return null;\n}\n\n/**\n * Gets the currently-focused element on the page while\n * also piercing through Shadow DOM boundaries.\n */\nexport function _getFocusedElementPierceShadowDom(): HTMLElement | null {\n let activeElement =\n typeof document !== 'undefined' && document\n ? (document.activeElement as HTMLElement | null)\n : null;\n\n while (activeElement && activeElement.shadowRoot) {\n const newActiveElement = activeElement.shadowRoot.activeElement as HTMLElement | null;\n if (newActiveElement === activeElement) {\n break;\n } else {\n activeElement = newActiveElement;\n }\n }\n\n return activeElement;\n}\n\n/** Gets the target of an event while accounting for Shadow DOM. */\nexport function _getEventTarget<T extends EventTarget>(event: Event): T | null {\n // If an event is bound outside the Shadow DOM, the `event.target` will\n // point to the shadow root so we have to use `composedPath` instead.\n return (event.composedPath ? event.composedPath()[0] : event.target) as T | null;\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.dev/license\n */\n\n/** Gets whether the code is currently running in a test environment. */\nexport function _isTestEnvironment(): boolean {\n // We can't use `declare const` because it causes conflicts inside Google with the real typings\n // for these symbols and we can't read them off the global object, because they don't appear to\n // be attached there for some runners like Jest.\n // (see: https://github.com/angular/components/issues/23365#issuecomment-938146643)\n return (\n // @ts-ignore\n (typeof __karma__ !== 'undefined' && !!__karma__) ||\n // @ts-ignore\n (typeof jasmine !== 'undefined' && !!jasmine) ||\n // @ts-ignore\n (typeof jest !== 'undefined' && !!jest) ||\n // @ts-ignore\n (typeof Mocha !== 'undefined' && !!Mocha)\n );\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
package/fesm2022/portal.mjs
CHANGED
|
@@ -51,6 +51,7 @@ function throwNoPortalAttachedError() {
|
|
|
51
51
|
* It can be attach to / detached from a `PortalOutlet`.
|
|
52
52
|
*/
|
|
53
53
|
class Portal {
|
|
54
|
+
_attachedHost;
|
|
54
55
|
/** Attach this portal to a host. */
|
|
55
56
|
attach(host) {
|
|
56
57
|
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
@@ -91,6 +92,25 @@ class Portal {
|
|
|
91
92
|
* A `ComponentPortal` is a portal that instantiates some Component upon attachment.
|
|
92
93
|
*/
|
|
93
94
|
class ComponentPortal extends Portal {
|
|
95
|
+
/** The type of the component that will be instantiated for attachment. */
|
|
96
|
+
component;
|
|
97
|
+
/**
|
|
98
|
+
* Where the attached component should live in Angular's *logical* component tree.
|
|
99
|
+
* This is different from where the component *renders*, which is determined by the PortalOutlet.
|
|
100
|
+
* The origin is necessary when the host is outside of the Angular application context.
|
|
101
|
+
*/
|
|
102
|
+
viewContainerRef;
|
|
103
|
+
/** Injector used for the instantiation of the component. */
|
|
104
|
+
injector;
|
|
105
|
+
/**
|
|
106
|
+
* @deprecated No longer in use. To be removed.
|
|
107
|
+
* @breaking-change 18.0.0
|
|
108
|
+
*/
|
|
109
|
+
componentFactoryResolver;
|
|
110
|
+
/**
|
|
111
|
+
* List of DOM nodes that should be projected through `<ng-content>` of the attached component.
|
|
112
|
+
*/
|
|
113
|
+
projectableNodes;
|
|
94
114
|
constructor(component, viewContainerRef, injector,
|
|
95
115
|
/**
|
|
96
116
|
* @deprecated No longer in use. To be removed.
|
|
@@ -108,6 +128,10 @@ class ComponentPortal extends Portal {
|
|
|
108
128
|
* A `TemplatePortal` is a portal that represents some embedded template (TemplateRef).
|
|
109
129
|
*/
|
|
110
130
|
class TemplatePortal extends Portal {
|
|
131
|
+
templateRef;
|
|
132
|
+
viewContainerRef;
|
|
133
|
+
context;
|
|
134
|
+
injector;
|
|
111
135
|
constructor(
|
|
112
136
|
/** The embedded template that will be used to instantiate an embedded View in the host. */
|
|
113
137
|
templateRef,
|
|
@@ -146,6 +170,8 @@ class TemplatePortal extends Portal {
|
|
|
146
170
|
* will be restored to its original position.
|
|
147
171
|
*/
|
|
148
172
|
class DomPortal extends Portal {
|
|
173
|
+
/** DOM node hosting the portal's content. */
|
|
174
|
+
element;
|
|
149
175
|
constructor(element) {
|
|
150
176
|
super();
|
|
151
177
|
this.element = element instanceof ElementRef ? element.nativeElement : element;
|
|
@@ -156,12 +182,12 @@ class DomPortal extends Portal {
|
|
|
156
182
|
* ComponentPortal and TemplatePortal.
|
|
157
183
|
*/
|
|
158
184
|
class BasePortalOutlet {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
185
|
+
/** The portal currently attached to the host. */
|
|
186
|
+
_attachedPortal;
|
|
187
|
+
/** A function that will permanently dispose this host. */
|
|
188
|
+
_disposeFn;
|
|
189
|
+
/** Whether this host has already been permanently disposed. */
|
|
190
|
+
_isDisposed = false;
|
|
165
191
|
/** Whether this host has an attached portal. */
|
|
166
192
|
hasAttached() {
|
|
167
193
|
return !!this._attachedPortal;
|
|
@@ -196,6 +222,8 @@ class BasePortalOutlet {
|
|
|
196
222
|
throwUnknownPortalTypeError();
|
|
197
223
|
}
|
|
198
224
|
}
|
|
225
|
+
// @breaking-change 10.0.0 `attachDomPortal` to become a required abstract method.
|
|
226
|
+
attachDomPortal = null;
|
|
199
227
|
/** Detaches a previously attached portal. */
|
|
200
228
|
detach() {
|
|
201
229
|
if (this._attachedPortal) {
|
|
@@ -235,6 +263,10 @@ class BasePortalHost extends BasePortalOutlet {
|
|
|
235
263
|
* application context.
|
|
236
264
|
*/
|
|
237
265
|
class DomPortalOutlet extends BasePortalOutlet {
|
|
266
|
+
outletElement;
|
|
267
|
+
_appRef;
|
|
268
|
+
_defaultInjector;
|
|
269
|
+
_document;
|
|
238
270
|
/**
|
|
239
271
|
* @param outletElement Element into which the content is projected.
|
|
240
272
|
* @param _unusedComponentFactoryResolver Used to resolve the component factory.
|
|
@@ -263,30 +295,6 @@ class DomPortalOutlet extends BasePortalOutlet {
|
|
|
263
295
|
this.outletElement = outletElement;
|
|
264
296
|
this._appRef = _appRef;
|
|
265
297
|
this._defaultInjector = _defaultInjector;
|
|
266
|
-
/**
|
|
267
|
-
* Attaches a DOM portal by transferring its content into the outlet.
|
|
268
|
-
* @param portal Portal to be attached.
|
|
269
|
-
* @deprecated To be turned into a method.
|
|
270
|
-
* @breaking-change 10.0.0
|
|
271
|
-
*/
|
|
272
|
-
this.attachDomPortal = (portal) => {
|
|
273
|
-
const element = portal.element;
|
|
274
|
-
if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
275
|
-
throw Error('DOM portal content must be attached to a parent node.');
|
|
276
|
-
}
|
|
277
|
-
// Anchor used to save the element's previous position so
|
|
278
|
-
// that we can restore it when the portal is detached.
|
|
279
|
-
const anchorNode = this._document.createComment('dom-portal');
|
|
280
|
-
element.parentNode.insertBefore(anchorNode, element);
|
|
281
|
-
this.outletElement.appendChild(element);
|
|
282
|
-
this._attachedPortal = portal;
|
|
283
|
-
super.setDisposeFn(() => {
|
|
284
|
-
// We can't use `replaceWith` here because IE doesn't support it.
|
|
285
|
-
if (anchorNode.parentNode) {
|
|
286
|
-
anchorNode.parentNode.replaceChild(element, anchorNode);
|
|
287
|
-
}
|
|
288
|
-
});
|
|
289
|
-
};
|
|
290
298
|
this._document = _document;
|
|
291
299
|
}
|
|
292
300
|
/**
|
|
@@ -365,6 +373,30 @@ class DomPortalOutlet extends BasePortalOutlet {
|
|
|
365
373
|
// TODO(jelbourn): Return locals from view.
|
|
366
374
|
return viewRef;
|
|
367
375
|
}
|
|
376
|
+
/**
|
|
377
|
+
* Attaches a DOM portal by transferring its content into the outlet.
|
|
378
|
+
* @param portal Portal to be attached.
|
|
379
|
+
* @deprecated To be turned into a method.
|
|
380
|
+
* @breaking-change 10.0.0
|
|
381
|
+
*/
|
|
382
|
+
attachDomPortal = (portal) => {
|
|
383
|
+
const element = portal.element;
|
|
384
|
+
if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
385
|
+
throw Error('DOM portal content must be attached to a parent node.');
|
|
386
|
+
}
|
|
387
|
+
// Anchor used to save the element's previous position so
|
|
388
|
+
// that we can restore it when the portal is detached.
|
|
389
|
+
const anchorNode = this._document.createComment('dom-portal');
|
|
390
|
+
element.parentNode.insertBefore(anchorNode, element);
|
|
391
|
+
this.outletElement.appendChild(element);
|
|
392
|
+
this._attachedPortal = portal;
|
|
393
|
+
super.setDisposeFn(() => {
|
|
394
|
+
// We can't use `replaceWith` here because IE doesn't support it.
|
|
395
|
+
if (anchorNode.parentNode) {
|
|
396
|
+
anchorNode.parentNode.replaceChild(element, anchorNode);
|
|
397
|
+
}
|
|
398
|
+
});
|
|
399
|
+
};
|
|
368
400
|
/**
|
|
369
401
|
* Clears out a portal from the DOM.
|
|
370
402
|
*/
|
|
@@ -394,8 +426,8 @@ class CdkPortal extends TemplatePortal {
|
|
|
394
426
|
const viewContainerRef = inject(ViewContainerRef);
|
|
395
427
|
super(templateRef, viewContainerRef);
|
|
396
428
|
}
|
|
397
|
-
static
|
|
398
|
-
static
|
|
429
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: CdkPortal, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
430
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.0-next.10", type: CdkPortal, isStandalone: true, selector: "[cdkPortal]", exportAs: ["cdkPortal"], usesInheritance: true, ngImport: i0 });
|
|
399
431
|
}
|
|
400
432
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: CdkPortal, decorators: [{
|
|
401
433
|
type: Directive,
|
|
@@ -409,13 +441,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10",
|
|
|
409
441
|
* @breaking-change 9.0.0
|
|
410
442
|
*/
|
|
411
443
|
class TemplatePortalDirective extends CdkPortal {
|
|
412
|
-
static
|
|
413
|
-
static
|
|
444
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: TemplatePortalDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
445
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.0-next.10", type: TemplatePortalDirective, isStandalone: true, selector: "[cdk-portal], [portal]", providers: [
|
|
414
446
|
{
|
|
415
447
|
provide: CdkPortal,
|
|
416
448
|
useExisting: TemplatePortalDirective,
|
|
417
449
|
},
|
|
418
|
-
], exportAs: ["cdkPortal"], usesInheritance: true, ngImport: i0 });
|
|
450
|
+
], exportAs: ["cdkPortal"], usesInheritance: true, ngImport: i0 });
|
|
419
451
|
}
|
|
420
452
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: TemplatePortalDirective, decorators: [{
|
|
421
453
|
type: Directive,
|
|
@@ -438,39 +470,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10",
|
|
|
438
470
|
* `<ng-template [cdkPortalOutlet]="greeting"></ng-template>`
|
|
439
471
|
*/
|
|
440
472
|
class CdkPortalOutlet extends BasePortalOutlet {
|
|
473
|
+
_moduleRef = inject(NgModuleRef, { optional: true });
|
|
474
|
+
_document = inject(DOCUMENT);
|
|
475
|
+
_viewContainerRef = inject(ViewContainerRef);
|
|
476
|
+
/** Whether the portal component is initialized. */
|
|
477
|
+
_isInitialized = false;
|
|
478
|
+
/** Reference to the currently-attached component/view ref. */
|
|
479
|
+
_attachedRef;
|
|
441
480
|
constructor() {
|
|
442
481
|
super();
|
|
443
|
-
this._moduleRef = inject(NgModuleRef, { optional: true });
|
|
444
|
-
this._document = inject(DOCUMENT);
|
|
445
|
-
this._viewContainerRef = inject(ViewContainerRef);
|
|
446
|
-
/** Whether the portal component is initialized. */
|
|
447
|
-
this._isInitialized = false;
|
|
448
|
-
/** Emits when a portal is attached to the outlet. */
|
|
449
|
-
this.attached = new EventEmitter();
|
|
450
|
-
/**
|
|
451
|
-
* Attaches the given DomPortal to this PortalHost by moving all of the portal content into it.
|
|
452
|
-
* @param portal Portal to be attached.
|
|
453
|
-
* @deprecated To be turned into a method.
|
|
454
|
-
* @breaking-change 10.0.0
|
|
455
|
-
*/
|
|
456
|
-
this.attachDomPortal = (portal) => {
|
|
457
|
-
const element = portal.element;
|
|
458
|
-
if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
459
|
-
throw Error('DOM portal content must be attached to a parent node.');
|
|
460
|
-
}
|
|
461
|
-
// Anchor used to save the element's previous position so
|
|
462
|
-
// that we can restore it when the portal is detached.
|
|
463
|
-
const anchorNode = this._document.createComment('dom-portal');
|
|
464
|
-
portal.setAttachedHost(this);
|
|
465
|
-
element.parentNode.insertBefore(anchorNode, element);
|
|
466
|
-
this._getRootNode().appendChild(element);
|
|
467
|
-
this._attachedPortal = portal;
|
|
468
|
-
super.setDisposeFn(() => {
|
|
469
|
-
if (anchorNode.parentNode) {
|
|
470
|
-
anchorNode.parentNode.replaceChild(element, anchorNode);
|
|
471
|
-
}
|
|
472
|
-
});
|
|
473
|
-
};
|
|
474
482
|
}
|
|
475
483
|
/** Portal associated with the Portal outlet. */
|
|
476
484
|
get portal() {
|
|
@@ -492,6 +500,8 @@ class CdkPortalOutlet extends BasePortalOutlet {
|
|
|
492
500
|
}
|
|
493
501
|
this._attachedPortal = portal || null;
|
|
494
502
|
}
|
|
503
|
+
/** Emits when a portal is attached to the outlet. */
|
|
504
|
+
attached = new EventEmitter();
|
|
495
505
|
/** Component or view reference that is attached to the portal. */
|
|
496
506
|
get attachedRef() {
|
|
497
507
|
return this._attachedRef;
|
|
@@ -548,6 +558,30 @@ class CdkPortalOutlet extends BasePortalOutlet {
|
|
|
548
558
|
this.attached.emit(viewRef);
|
|
549
559
|
return viewRef;
|
|
550
560
|
}
|
|
561
|
+
/**
|
|
562
|
+
* Attaches the given DomPortal to this PortalHost by moving all of the portal content into it.
|
|
563
|
+
* @param portal Portal to be attached.
|
|
564
|
+
* @deprecated To be turned into a method.
|
|
565
|
+
* @breaking-change 10.0.0
|
|
566
|
+
*/
|
|
567
|
+
attachDomPortal = (portal) => {
|
|
568
|
+
const element = portal.element;
|
|
569
|
+
if (!element.parentNode && (typeof ngDevMode === 'undefined' || ngDevMode)) {
|
|
570
|
+
throw Error('DOM portal content must be attached to a parent node.');
|
|
571
|
+
}
|
|
572
|
+
// Anchor used to save the element's previous position so
|
|
573
|
+
// that we can restore it when the portal is detached.
|
|
574
|
+
const anchorNode = this._document.createComment('dom-portal');
|
|
575
|
+
portal.setAttachedHost(this);
|
|
576
|
+
element.parentNode.insertBefore(anchorNode, element);
|
|
577
|
+
this._getRootNode().appendChild(element);
|
|
578
|
+
this._attachedPortal = portal;
|
|
579
|
+
super.setDisposeFn(() => {
|
|
580
|
+
if (anchorNode.parentNode) {
|
|
581
|
+
anchorNode.parentNode.replaceChild(element, anchorNode);
|
|
582
|
+
}
|
|
583
|
+
});
|
|
584
|
+
};
|
|
551
585
|
/** Gets the root node of the portal outlet. */
|
|
552
586
|
_getRootNode() {
|
|
553
587
|
const nativeElement = this._viewContainerRef.element.nativeElement;
|
|
@@ -557,8 +591,8 @@ class CdkPortalOutlet extends BasePortalOutlet {
|
|
|
557
591
|
? nativeElement
|
|
558
592
|
: nativeElement.parentNode);
|
|
559
593
|
}
|
|
560
|
-
static
|
|
561
|
-
static
|
|
594
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: CdkPortalOutlet, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
595
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.0-next.10", type: CdkPortalOutlet, isStandalone: true, selector: "[cdkPortalOutlet]", inputs: { portal: ["cdkPortalOutlet", "portal"] }, outputs: { attached: "attached" }, exportAs: ["cdkPortalOutlet"], usesInheritance: true, ngImport: i0 });
|
|
562
596
|
}
|
|
563
597
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: CdkPortalOutlet, decorators: [{
|
|
564
598
|
type: Directive,
|
|
@@ -577,13 +611,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10",
|
|
|
577
611
|
* @breaking-change 9.0.0
|
|
578
612
|
*/
|
|
579
613
|
class PortalHostDirective extends CdkPortalOutlet {
|
|
580
|
-
static
|
|
581
|
-
static
|
|
614
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: PortalHostDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
|
|
615
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.0-next.10", type: PortalHostDirective, isStandalone: true, selector: "[cdkPortalHost], [portalHost]", inputs: { portal: ["cdkPortalHost", "portal"] }, providers: [
|
|
582
616
|
{
|
|
583
617
|
provide: CdkPortalOutlet,
|
|
584
618
|
useExisting: PortalHostDirective,
|
|
585
619
|
},
|
|
586
|
-
], exportAs: ["cdkPortalHost"], usesInheritance: true, ngImport: i0 });
|
|
620
|
+
], exportAs: ["cdkPortalHost"], usesInheritance: true, ngImport: i0 });
|
|
587
621
|
}
|
|
588
622
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: PortalHostDirective, decorators: [{
|
|
589
623
|
type: Directive,
|
|
@@ -600,9 +634,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10",
|
|
|
600
634
|
}]
|
|
601
635
|
}] });
|
|
602
636
|
class PortalModule {
|
|
603
|
-
static
|
|
604
|
-
static
|
|
605
|
-
static
|
|
637
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: PortalModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
638
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0-next.10", ngImport: i0, type: PortalModule, imports: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective], exports: [CdkPortal, CdkPortalOutlet, TemplatePortalDirective, PortalHostDirective] });
|
|
639
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: PortalModule });
|
|
606
640
|
}
|
|
607
641
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: PortalModule, decorators: [{
|
|
608
642
|
type: NgModule,
|
|
@@ -620,6 +654,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10",
|
|
|
620
654
|
* @breaking-change 11.0.0
|
|
621
655
|
*/
|
|
622
656
|
class PortalInjector {
|
|
657
|
+
_parentInjector;
|
|
658
|
+
_customTokens;
|
|
623
659
|
constructor(_parentInjector, _customTokens) {
|
|
624
660
|
this._parentInjector = _parentInjector;
|
|
625
661
|
this._customTokens = _customTokens;
|