@angular/platform-browser 19.0.0-next.0 → 19.0.0-next.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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1 -1
  3. package/animations/async/index.d.ts +10 -1
  4. package/animations/index.d.ts +1 -1
  5. package/fesm2022/animations/async.mjs +25 -9
  6. package/fesm2022/animations/async.mjs.map +1 -1
  7. package/fesm2022/animations.mjs +12 -12
  8. package/fesm2022/animations.mjs.map +1 -1
  9. package/fesm2022/platform-browser.mjs +198 -204
  10. package/fesm2022/platform-browser.mjs.map +1 -1
  11. package/fesm2022/testing.mjs +5 -5
  12. package/fesm2022/testing.mjs.map +1 -1
  13. package/index.d.ts +54 -33
  14. package/package.json +4 -12
  15. package/testing/index.d.ts +1 -1
  16. package/esm2022/animations/animations.mjs +0 -5
  17. package/esm2022/animations/async/async.mjs +0 -5
  18. package/esm2022/animations/async/index.mjs +0 -13
  19. package/esm2022/animations/async/public_api.mjs +0 -14
  20. package/esm2022/animations/async/src/async-animations.mjs +0 -15
  21. package/esm2022/animations/async/src/async_animation_renderer.mjs +0 -207
  22. package/esm2022/animations/async/src/private_export.mjs +0 -9
  23. package/esm2022/animations/async/src/providers.mjs +0 -55
  24. package/esm2022/animations/index.mjs +0 -13
  25. package/esm2022/animations/public_api.mjs +0 -14
  26. package/esm2022/animations/src/animations.mjs +0 -16
  27. package/esm2022/animations/src/module.mjs +0 -123
  28. package/esm2022/animations/src/private_export.mjs +0 -9
  29. package/esm2022/animations/src/providers.mjs +0 -66
  30. package/esm2022/index.mjs +0 -13
  31. package/esm2022/platform-browser.mjs +0 -5
  32. package/esm2022/public_api.mjs +0 -15
  33. package/esm2022/src/browser/browser_adapter.mjs +0 -86
  34. package/esm2022/src/browser/generic_browser_adapter.mjs +0 -21
  35. package/esm2022/src/browser/meta.mjs +0 -176
  36. package/esm2022/src/browser/testability.mjs +0 -57
  37. package/esm2022/src/browser/title.mjs +0 -48
  38. package/esm2022/src/browser/tools/common_tools.mjs +0 -63
  39. package/esm2022/src/browser/tools/tools.mjs +0 -36
  40. package/esm2022/src/browser/xhr.mjs +0 -16
  41. package/esm2022/src/browser.mjs +0 -241
  42. package/esm2022/src/dom/debug/by.mjs +0 -61
  43. package/esm2022/src/dom/dom_renderer.mjs +0 -381
  44. package/esm2022/src/dom/events/dom_events.mjs +0 -37
  45. package/esm2022/src/dom/events/event_delegation.mjs +0 -37
  46. package/esm2022/src/dom/events/event_manager.mjs +0 -91
  47. package/esm2022/src/dom/events/hammer_gestures.mjs +0 -266
  48. package/esm2022/src/dom/events/key_events.mjs +0 -183
  49. package/esm2022/src/dom/shared_styles_host.mjs +0 -161
  50. package/esm2022/src/dom/util.mjs +0 -26
  51. package/esm2022/src/errors.mjs +0 -2
  52. package/esm2022/src/hydration.mjs +0 -178
  53. package/esm2022/src/platform-browser.mjs +0 -20
  54. package/esm2022/src/private_export.mjs +0 -18
  55. package/esm2022/src/security/dom_sanitization_service.mjs +0 -119
  56. package/esm2022/src/version.mjs +0 -18
  57. package/esm2022/testing/index.mjs +0 -13
  58. package/esm2022/testing/public_api.mjs +0 -15
  59. package/esm2022/testing/src/browser.mjs +0 -52
  60. package/esm2022/testing/src/browser_util.mjs +0 -130
  61. package/esm2022/testing/src/matchers.mjs +0 -146
  62. package/esm2022/testing/src/testing.mjs +0 -14
  63. package/esm2022/testing/testing.mjs +0 -5
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license Angular v19.0.0-next.0
2
+ * @license Angular v19.0.0-next.10
3
3
  * (c) 2010-2024 Google LLC. https://angular.io/
4
4
  * License: MIT
5
5
  */
@@ -7,7 +7,7 @@
7
7
  import { ɵDomAdapter, ɵsetRootDomAdapter, ɵparseCookieValue, ɵgetDOM, isPlatformServer, DOCUMENT, ɵPLATFORM_BROWSER_ID, XhrFactory, CommonModule } from '@angular/common';
8
8
  export { ɵgetDOM } from '@angular/common';
9
9
  import * as i0 from '@angular/core';
10
- import { ɵglobal, ɵRuntimeError, Injectable, InjectionToken, Inject, APP_ID, CSP_NONCE, PLATFORM_ID, Optional, ViewEncapsulation, RendererStyleFlags2, inject, ɵGLOBAL_EVENT_DELEGATION, ɵinternalCreateApplication, ErrorHandler, ɵsetDocument, PLATFORM_INITIALIZER, createPlatformFactory, platformCore, ɵTESTABILITY_GETTER, ɵTESTABILITY, Testability, NgZone, TestabilityRegistry, ɵINJECTOR_SCOPE, RendererFactory2, ApplicationModule, NgModule, SkipSelf, ApplicationRef, ɵConsole, forwardRef, ɵXSS_SECURITY_URL, SecurityContext, ɵallowSanitizationBypassAndThrow, ɵunwrapSafeValue, ɵ_sanitizeUrl, ɵ_sanitizeHtml, ɵbypassSanitizationTrustHtml, ɵbypassSanitizationTrustStyle, ɵbypassSanitizationTrustScript, ɵbypassSanitizationTrustUrl, ɵbypassSanitizationTrustResourceUrl, ɵwithI18nSupport, ɵwithEventReplay, ENVIRONMENT_INITIALIZER, ɵformatRuntimeError, makeEnvironmentProviders, ɵwithDomHydration, Version } from '@angular/core';
10
+ import { ɵglobal, ɵRuntimeError, Injectable, InjectionToken, Inject, APP_ID, CSP_NONCE, PLATFORM_ID, Optional, ViewEncapsulation, RendererStyleFlags2, ɵinternalCreateApplication, ErrorHandler, ɵsetDocument, PLATFORM_INITIALIZER, createPlatformFactory, platformCore, ɵTESTABILITY_GETTER, ɵTESTABILITY, Testability, NgZone, TestabilityRegistry, ɵINJECTOR_SCOPE, RendererFactory2, ApplicationModule, NgModule, SkipSelf, ApplicationRef, ɵConsole, forwardRef, ɵXSS_SECURITY_URL, SecurityContext, ɵallowSanitizationBypassAndThrow, ɵunwrapSafeValue, ɵ_sanitizeUrl, ɵ_sanitizeHtml, ɵbypassSanitizationTrustHtml, ɵbypassSanitizationTrustStyle, ɵbypassSanitizationTrustScript, ɵbypassSanitizationTrustUrl, ɵbypassSanitizationTrustResourceUrl, ɵwithI18nSupport, ɵwithEventReplay, ENVIRONMENT_INITIALIZER, inject, ɵZONELESS_ENABLED, ɵformatRuntimeError, makeEnvironmentProviders, ɵwithDomHydration, Version } from '@angular/core';
11
11
  import { ɵwithHttpTransferCache } from '@angular/common/http';
12
12
 
13
13
  /**
@@ -155,10 +155,10 @@ class BrowserXhr {
155
155
  build() {
156
156
  return new XMLHttpRequest();
157
157
  }
158
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: BrowserXhr, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
159
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: BrowserXhr }); }
158
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserXhr, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
159
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserXhr }); }
160
160
  }
161
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: BrowserXhr, decorators: [{
161
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserXhr, decorators: [{
162
162
  type: Injectable
163
163
  }] });
164
164
 
@@ -220,10 +220,10 @@ class EventManager {
220
220
  this._eventNameToPlugin.set(eventName, plugin);
221
221
  return plugin;
222
222
  }
223
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: EventManager, deps: [{ token: EVENT_MANAGER_PLUGINS }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
224
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: EventManager }); }
223
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: EventManager, deps: [{ token: EVENT_MANAGER_PLUGINS }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
224
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: EventManager }); }
225
225
  }
226
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: EventManager, decorators: [{
226
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: EventManager, decorators: [{
227
227
  type: Injectable
228
228
  }], ctorParameters: () => [{ type: undefined, decorators: [{
229
229
  type: Inject,
@@ -246,138 +246,173 @@ class EventManagerPlugin {
246
246
 
247
247
  /** The style elements attribute name used to set value of `APP_ID` token. */
248
248
  const APP_ID_ATTRIBUTE_NAME = 'ng-app-id';
249
+ /**
250
+ * Removes all provided elements from the document.
251
+ * @param elements An array of HTML Elements.
252
+ */
253
+ function removeElements(elements) {
254
+ for (const element of elements) {
255
+ element.remove();
256
+ }
257
+ }
258
+ /**
259
+ * Creates a `style` element with the provided inline style content.
260
+ * @param style A string of the inline style content.
261
+ * @param doc A DOM Document to use to create the element.
262
+ * @returns An HTMLStyleElement instance.
263
+ */
264
+ function createStyleElement(style, doc) {
265
+ const styleElement = doc.createElement('style');
266
+ styleElement.textContent = style;
267
+ return styleElement;
268
+ }
269
+ /**
270
+ * Searches a DOM document's head element for style elements with a matching application
271
+ * identifier attribute (`ng-app-id`) to the provide identifier and adds usage records for each.
272
+ * @param doc An HTML DOM document instance.
273
+ * @param appId A string containing an Angular application identifer.
274
+ * @param usages A Map object for tracking style usage.
275
+ */
276
+ function addServerStyles(doc, appId, usages) {
277
+ const styleElements = doc.head?.querySelectorAll(`style[${APP_ID_ATTRIBUTE_NAME}="${appId}"]`);
278
+ if (styleElements) {
279
+ for (const styleElement of styleElements) {
280
+ if (styleElement.textContent) {
281
+ styleElement.removeAttribute(APP_ID_ATTRIBUTE_NAME);
282
+ usages.set(styleElement.textContent, { usage: 0, elements: [styleElement] });
283
+ }
284
+ }
285
+ }
286
+ }
287
+ /**
288
+ * Creates a `link` element for the provided external style URL.
289
+ * @param url A string of the URL for the stylesheet.
290
+ * @param doc A DOM Document to use to create the element.
291
+ * @returns An HTMLLinkElement instance.
292
+ */
293
+ function createLinkElement(url, doc) {
294
+ const linkElement = doc.createElement('link');
295
+ linkElement.setAttribute('rel', 'stylesheet');
296
+ linkElement.setAttribute('href', url);
297
+ return linkElement;
298
+ }
249
299
  class SharedStylesHost {
250
300
  constructor(doc, appId, nonce, platformId = {}) {
251
301
  this.doc = doc;
252
302
  this.appId = appId;
253
303
  this.nonce = nonce;
254
- this.platformId = platformId;
255
- // Maps all registered host nodes to a list of style nodes that have been added to the host node.
256
- this.styleRef = new Map();
257
- this.hostNodes = new Set();
258
- this.styleNodesInDOM = this.collectServerRenderedStyles();
259
- this.platformIsServer = isPlatformServer(platformId);
260
- this.resetHostNodes();
304
+ /**
305
+ * Provides usage information for active inline style content and associated HTML <style> elements.
306
+ * Embedded styles typically originate from the `styles` metadata of a rendered component.
307
+ */
308
+ this.inline = new Map();
309
+ /**
310
+ * Provides usage information for active external style URLs and the associated HTML <link> elements.
311
+ * External styles typically originate from the `ɵɵExternalStylesFeature` of a rendered component.
312
+ */
313
+ this.external = new Map();
314
+ /**
315
+ * Set of host DOM nodes that will have styles attached.
316
+ */
317
+ this.hosts = new Set();
318
+ this.isServer = isPlatformServer(platformId);
319
+ addServerStyles(doc, appId, this.inline);
320
+ this.hosts.add(doc.head);
261
321
  }
262
- addStyles(styles) {
263
- for (const style of styles) {
264
- const usageCount = this.changeUsageCount(style, 1);
265
- if (usageCount === 1) {
266
- this.onStyleAdded(style);
322
+ /**
323
+ * Adds embedded styles to the DOM via HTML `style` elements.
324
+ * @param styles An array of style content strings.
325
+ */
326
+ addStyles(styles, urls) {
327
+ for (const value of styles) {
328
+ this.addUsage(value, this.inline, createStyleElement);
329
+ }
330
+ urls?.forEach((value) => this.addUsage(value, this.external, createLinkElement));
331
+ }
332
+ /**
333
+ * Removes embedded styles from the DOM that were added as HTML `style` elements.
334
+ * @param styles An array of style content strings.
335
+ */
336
+ removeStyles(styles, urls) {
337
+ for (const value of styles) {
338
+ this.removeUsage(value, this.inline);
339
+ }
340
+ urls?.forEach((value) => this.removeUsage(value, this.external));
341
+ }
342
+ addUsage(value, usages, creator) {
343
+ // Attempt to get any current usage of the value
344
+ const record = usages.get(value);
345
+ // If existing, just increment the usage count
346
+ if (record) {
347
+ if ((typeof ngDevMode === 'undefined' || ngDevMode) && record.usage === 0) {
348
+ // A usage count of zero indicates a preexisting server generated style.
349
+ // This attribute is solely used for debugging purposes of SSR style reuse.
350
+ record.elements.forEach((element) => element.setAttribute('ng-style-reused', ''));
267
351
  }
352
+ record.usage++;
353
+ }
354
+ else {
355
+ // Otherwise, create an entry to track the elements and add element for each host
356
+ usages.set(value, {
357
+ usage: 1,
358
+ elements: [...this.hosts].map((host) => this.addElement(host, creator(value, this.doc))),
359
+ });
268
360
  }
269
361
  }
270
- removeStyles(styles) {
271
- for (const style of styles) {
272
- const usageCount = this.changeUsageCount(style, -1);
273
- if (usageCount <= 0) {
274
- this.onStyleRemoved(style);
362
+ removeUsage(value, usages) {
363
+ // Attempt to get any current usage of the value
364
+ const record = usages.get(value);
365
+ // If there is a record, reduce the usage count and if no longer used,
366
+ // remove from DOM and delete usage record.
367
+ if (record) {
368
+ record.usage--;
369
+ if (record.usage <= 0) {
370
+ removeElements(record.elements);
371
+ usages.delete(value);
275
372
  }
276
373
  }
277
374
  }
278
375
  ngOnDestroy() {
279
- const styleNodesInDOM = this.styleNodesInDOM;
280
- if (styleNodesInDOM) {
281
- styleNodesInDOM.forEach((node) => node.remove());
282
- styleNodesInDOM.clear();
376
+ for (const [, { elements }] of [...this.inline, ...this.external]) {
377
+ removeElements(elements);
283
378
  }
284
- for (const style of this.getAllStyles()) {
285
- this.onStyleRemoved(style);
286
- }
287
- this.resetHostNodes();
379
+ this.hosts.clear();
288
380
  }
381
+ /**
382
+ * Adds a host node to the set of style hosts and adds all existing style usage to
383
+ * the newly added host node.
384
+ *
385
+ * This is currently only used for Shadow DOM encapsulation mode.
386
+ */
289
387
  addHost(hostNode) {
290
- this.hostNodes.add(hostNode);
291
- for (const style of this.getAllStyles()) {
292
- this.addStyleToHost(hostNode, style);
293
- }
294
- }
295
- removeHost(hostNode) {
296
- this.hostNodes.delete(hostNode);
297
- }
298
- getAllStyles() {
299
- return this.styleRef.keys();
300
- }
301
- onStyleAdded(style) {
302
- for (const host of this.hostNodes) {
303
- this.addStyleToHost(host, style);
388
+ this.hosts.add(hostNode);
389
+ // Add existing styles to new host
390
+ for (const [style, { elements }] of this.inline) {
391
+ elements.push(this.addElement(hostNode, createStyleElement(style, this.doc)));
304
392
  }
305
- }
306
- onStyleRemoved(style) {
307
- const styleRef = this.styleRef;
308
- styleRef.get(style)?.elements?.forEach((node) => node.remove());
309
- styleRef.delete(style);
310
- }
311
- collectServerRenderedStyles() {
312
- const styles = this.doc.head?.querySelectorAll(`style[${APP_ID_ATTRIBUTE_NAME}="${this.appId}"]`);
313
- if (styles?.length) {
314
- const styleMap = new Map();
315
- styles.forEach((style) => {
316
- if (style.textContent != null) {
317
- styleMap.set(style.textContent, style);
318
- }
319
- });
320
- return styleMap;
393
+ for (const [url, { elements }] of this.external) {
394
+ elements.push(this.addElement(hostNode, createLinkElement(url, this.doc)));
321
395
  }
322
- return null;
323
396
  }
324
- changeUsageCount(style, delta) {
325
- const map = this.styleRef;
326
- if (map.has(style)) {
327
- const styleRefValue = map.get(style);
328
- styleRefValue.usage += delta;
329
- return styleRefValue.usage;
330
- }
331
- map.set(style, { usage: delta, elements: [] });
332
- return delta;
333
- }
334
- getStyleElement(host, style) {
335
- const styleNodesInDOM = this.styleNodesInDOM;
336
- const styleEl = styleNodesInDOM?.get(style);
337
- if (styleEl?.parentNode === host) {
338
- // `styleNodesInDOM` cannot be undefined due to the above `styleNodesInDOM?.get`.
339
- styleNodesInDOM.delete(style);
340
- styleEl.removeAttribute(APP_ID_ATTRIBUTE_NAME);
341
- if (typeof ngDevMode === 'undefined' || ngDevMode) {
342
- // This attribute is solely used for debugging purposes.
343
- styleEl.setAttribute('ng-style-reused', '');
344
- }
345
- return styleEl;
346
- }
347
- else {
348
- const styleEl = this.doc.createElement('style');
349
- if (this.nonce) {
350
- styleEl.setAttribute('nonce', this.nonce);
351
- }
352
- styleEl.textContent = style;
353
- if (this.platformIsServer) {
354
- styleEl.setAttribute(APP_ID_ATTRIBUTE_NAME, this.appId);
355
- }
356
- host.appendChild(styleEl);
357
- return styleEl;
358
- }
397
+ removeHost(hostNode) {
398
+ this.hosts.delete(hostNode);
359
399
  }
360
- addStyleToHost(host, style) {
361
- const styleEl = this.getStyleElement(host, style);
362
- const styleRef = this.styleRef;
363
- const styleElRef = styleRef.get(style)?.elements;
364
- if (styleElRef) {
365
- styleElRef.push(styleEl);
400
+ addElement(host, element) {
401
+ // Add a nonce if present
402
+ if (this.nonce) {
403
+ element.setAttribute('nonce', this.nonce);
366
404
  }
367
- else {
368
- styleRef.set(style, { elements: [styleEl], usage: 1 });
405
+ // Add application identifier when on the server to support client-side reuse
406
+ if (this.isServer) {
407
+ element.setAttribute(APP_ID_ATTRIBUTE_NAME, this.appId);
369
408
  }
409
+ // Insert the element into the DOM with the host node as parent
410
+ return host.appendChild(element);
370
411
  }
371
- resetHostNodes() {
372
- const hostNodes = this.hostNodes;
373
- hostNodes.clear();
374
- // Re-add the head element back since this is the default host.
375
- hostNodes.add(this.doc.head);
376
- }
377
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: SharedStylesHost, deps: [{ token: DOCUMENT }, { token: APP_ID }, { token: CSP_NONCE, optional: true }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
378
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: SharedStylesHost }); }
412
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: SharedStylesHost, deps: [{ token: DOCUMENT }, { token: APP_ID }, { token: CSP_NONCE, optional: true }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
413
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: SharedStylesHost }); }
379
414
  }
380
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: SharedStylesHost, decorators: [{
415
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: SharedStylesHost, decorators: [{
381
416
  type: Injectable
382
417
  }], ctorParameters: () => [{ type: Document, decorators: [{
383
418
  type: Inject,
@@ -491,10 +526,10 @@ class DomRendererFactory2 {
491
526
  ngOnDestroy() {
492
527
  this.rendererByCompId.clear();
493
528
  }
494
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomRendererFactory2, deps: [{ token: EventManager }, { token: SharedStylesHost }, { token: APP_ID }, { token: REMOVE_STYLES_ON_COMPONENT_DESTROY }, { token: DOCUMENT }, { token: PLATFORM_ID }, { token: i0.NgZone }, { token: CSP_NONCE }], target: i0.ɵɵFactoryTarget.Injectable }); }
495
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomRendererFactory2 }); }
529
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomRendererFactory2, deps: [{ token: EventManager }, { token: SharedStylesHost }, { token: APP_ID }, { token: REMOVE_STYLES_ON_COMPONENT_DESTROY }, { token: DOCUMENT }, { token: PLATFORM_ID }, { token: i0.NgZone }, { token: CSP_NONCE }], target: i0.ɵɵFactoryTarget.Injectable }); }
530
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomRendererFactory2 }); }
496
531
  }
497
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomRendererFactory2, decorators: [{
532
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomRendererFactory2, decorators: [{
498
533
  type: Injectable
499
534
  }], ctorParameters: () => [{ type: EventManager }, { type: SharedStylesHost }, { type: undefined, decorators: [{
500
535
  type: Inject,
@@ -733,15 +768,16 @@ class NoneEncapsulationDomRenderer extends DefaultDomRenderer2 {
733
768
  this.sharedStylesHost = sharedStylesHost;
734
769
  this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;
735
770
  this.styles = compId ? shimStylesContent(compId, component.styles) : component.styles;
771
+ this.styleUrls = component.getExternalStyles?.(compId);
736
772
  }
737
773
  applyStyles() {
738
- this.sharedStylesHost.addStyles(this.styles);
774
+ this.sharedStylesHost.addStyles(this.styles, this.styleUrls);
739
775
  }
740
776
  destroy() {
741
777
  if (!this.removeStylesOnCompDestroy) {
742
778
  return;
743
779
  }
744
- this.sharedStylesHost.removeStyles(this.styles);
780
+ this.sharedStylesHost.removeStyles(this.styles, this.styleUrls);
745
781
  }
746
782
  }
747
783
  class EmulatedEncapsulationDomRenderer2 extends NoneEncapsulationDomRenderer {
@@ -778,36 +814,10 @@ class DomEventsPlugin extends EventManagerPlugin {
778
814
  removeEventListener(target, eventName, callback) {
779
815
  return target.removeEventListener(eventName, callback);
780
816
  }
781
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomEventsPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
782
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomEventsPlugin }); }
783
- }
784
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomEventsPlugin, decorators: [{
785
- type: Injectable
786
- }], ctorParameters: () => [{ type: undefined, decorators: [{
787
- type: Inject,
788
- args: [DOCUMENT]
789
- }] }] });
790
-
791
- class EventDelegationPlugin extends EventManagerPlugin {
792
- constructor(doc) {
793
- super(doc);
794
- this.delegate = inject(ɵGLOBAL_EVENT_DELEGATION, { optional: true });
795
- }
796
- supports(eventName) {
797
- // If `GlobalDelegationEventPlugin` implementation is not provided,
798
- // this plugin is kept disabled.
799
- return this.delegate ? this.delegate.supports(eventName) : false;
800
- }
801
- addEventListener(element, eventName, handler) {
802
- return this.delegate.addEventListener(element, eventName, handler);
803
- }
804
- removeEventListener(element, eventName, callback) {
805
- return this.delegate.removeEventListener(element, eventName, callback);
806
- }
807
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: EventDelegationPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
808
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: EventDelegationPlugin }); }
817
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomEventsPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
818
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomEventsPlugin }); }
809
819
  }
810
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: EventDelegationPlugin, decorators: [{
820
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomEventsPlugin, decorators: [{
811
821
  type: Injectable
812
822
  }], ctorParameters: () => [{ type: undefined, decorators: [{
813
823
  type: Inject,
@@ -976,10 +986,10 @@ class KeyEventsPlugin extends EventManagerPlugin {
976
986
  static _normalizeKey(keyName) {
977
987
  return keyName === 'esc' ? 'escape' : keyName;
978
988
  }
979
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: KeyEventsPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
980
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: KeyEventsPlugin }); }
989
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: KeyEventsPlugin, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
990
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: KeyEventsPlugin }); }
981
991
  }
982
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: KeyEventsPlugin, decorators: [{
992
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: KeyEventsPlugin, decorators: [{
983
993
  type: Injectable
984
994
  }], ctorParameters: () => [{ type: undefined, decorators: [{
985
995
  type: Inject,
@@ -1143,11 +1153,6 @@ const BROWSER_MODULE_PROVIDERS = [
1143
1153
  deps: [DOCUMENT, NgZone, PLATFORM_ID],
1144
1154
  },
1145
1155
  { provide: EVENT_MANAGER_PLUGINS, useClass: KeyEventsPlugin, multi: true, deps: [DOCUMENT] },
1146
- {
1147
- provide: EVENT_MANAGER_PLUGINS,
1148
- useClass: EventDelegationPlugin,
1149
- multi: true,
1150
- },
1151
1156
  DomRendererFactory2,
1152
1157
  SharedStylesHost,
1153
1158
  EventManager,
@@ -1173,27 +1178,11 @@ class BrowserModule {
1173
1178
  `to common directives such as NgIf and NgFor, import the \`CommonModule\` instead.`);
1174
1179
  }
1175
1180
  }
1176
- /**
1177
- * Configures a browser-based app to transition from a server-rendered app, if
1178
- * one is present on the page.
1179
- *
1180
- * @param params An object containing an identifier for the app to transition.
1181
- * The ID must match between the client and server versions of the app.
1182
- * @returns The reconfigured `BrowserModule` to import into the app's root `AppModule`.
1183
- *
1184
- * @deprecated Use {@link APP_ID} instead to set the application ID.
1185
- */
1186
- static withServerTransition(params) {
1187
- return {
1188
- ngModule: BrowserModule,
1189
- providers: [{ provide: APP_ID, useValue: params.appId }],
1190
- };
1191
- }
1192
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: BrowserModule, deps: [{ token: BROWSER_MODULE_PROVIDERS_MARKER, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
1193
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0-next.0", ngImport: i0, type: BrowserModule, exports: [CommonModule, ApplicationModule] }); }
1194
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: BrowserModule, providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS], imports: [CommonModule, ApplicationModule] }); }
1181
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserModule, deps: [{ token: BROWSER_MODULE_PROVIDERS_MARKER, optional: true, skipSelf: true }], target: i0.ɵɵFactoryTarget.NgModule }); }
1182
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserModule, exports: [CommonModule, ApplicationModule] }); }
1183
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserModule, providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS], imports: [CommonModule, ApplicationModule] }); }
1195
1184
  }
1196
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: BrowserModule, decorators: [{
1185
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: BrowserModule, decorators: [{
1197
1186
  type: NgModule,
1198
1187
  args: [{
1199
1188
  providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
@@ -1357,10 +1346,10 @@ class Meta {
1357
1346
  _getMetaKeyMap(prop) {
1358
1347
  return META_KEYS_MAP[prop] || prop;
1359
1348
  }
1360
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: Meta, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
1361
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: Meta, providedIn: 'root' }); }
1349
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Meta, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
1350
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Meta, providedIn: 'root' }); }
1362
1351
  }
1363
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: Meta, decorators: [{
1352
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Meta, decorators: [{
1364
1353
  type: Injectable,
1365
1354
  args: [{ providedIn: 'root' }]
1366
1355
  }], ctorParameters: () => [{ type: undefined, decorators: [{
@@ -1401,10 +1390,10 @@ class Title {
1401
1390
  setTitle(newTitle) {
1402
1391
  this._doc.title = newTitle || '';
1403
1392
  }
1404
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: Title, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
1405
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: Title, providedIn: 'root' }); }
1393
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Title, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
1394
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Title, providedIn: 'root' }); }
1406
1395
  }
1407
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: Title, decorators: [{
1396
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: Title, decorators: [{
1408
1397
  type: Injectable,
1409
1398
  args: [{ providedIn: 'root' }]
1410
1399
  }], ctorParameters: () => [{ type: undefined, decorators: [{
@@ -1668,10 +1657,10 @@ class HammerGestureConfig {
1668
1657
  }
1669
1658
  return mc;
1670
1659
  }
1671
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: HammerGestureConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1672
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: HammerGestureConfig }); }
1660
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGestureConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1661
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGestureConfig }); }
1673
1662
  }
1674
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: HammerGestureConfig, decorators: [{
1663
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGestureConfig, decorators: [{
1675
1664
  type: Injectable
1676
1665
  }] });
1677
1666
  /**
@@ -1764,10 +1753,10 @@ class HammerGesturesPlugin extends EventManagerPlugin {
1764
1753
  isCustomEvent(eventName) {
1765
1754
  return this._config.events.indexOf(eventName) > -1;
1766
1755
  }
1767
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: HammerGesturesPlugin, deps: [{ token: DOCUMENT }, { token: HAMMER_GESTURE_CONFIG }, { token: i0.ɵConsole }, { token: HAMMER_LOADER, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1768
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: HammerGesturesPlugin }); }
1756
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGesturesPlugin, deps: [{ token: DOCUMENT }, { token: HAMMER_GESTURE_CONFIG }, { token: i0.ɵConsole }, { token: HAMMER_LOADER, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
1757
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGesturesPlugin }); }
1769
1758
  }
1770
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: HammerGesturesPlugin, decorators: [{
1759
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerGesturesPlugin, decorators: [{
1771
1760
  type: Injectable
1772
1761
  }], ctorParameters: () => [{ type: undefined, decorators: [{
1773
1762
  type: Inject,
@@ -1793,9 +1782,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0",
1793
1782
  * @publicApi
1794
1783
  */
1795
1784
  class HammerModule {
1796
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: HammerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1797
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0-next.0", ngImport: i0, type: HammerModule }); }
1798
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: HammerModule, providers: [
1785
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1786
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerModule }); }
1787
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerModule, providers: [
1799
1788
  {
1800
1789
  provide: EVENT_MANAGER_PLUGINS,
1801
1790
  useClass: HammerGesturesPlugin,
@@ -1805,7 +1794,7 @@ class HammerModule {
1805
1794
  { provide: HAMMER_GESTURE_CONFIG, useClass: HammerGestureConfig, deps: [] },
1806
1795
  ] }); }
1807
1796
  }
1808
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: HammerModule, decorators: [{
1797
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: HammerModule, decorators: [{
1809
1798
  type: NgModule,
1810
1799
  args: [{
1811
1800
  providers: [
@@ -1852,10 +1841,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0",
1852
1841
  * @publicApi
1853
1842
  */
1854
1843
  class DomSanitizer {
1855
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomSanitizer, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1856
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomSanitizer, providedIn: 'root', useExisting: i0.forwardRef(() => DomSanitizerImpl) }); }
1844
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizer, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1845
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizer, providedIn: 'root', useExisting: i0.forwardRef(() => DomSanitizerImpl) }); }
1857
1846
  }
1858
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomSanitizer, decorators: [{
1847
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizer, decorators: [{
1859
1848
  type: Injectable,
1860
1849
  args: [{ providedIn: 'root', useExisting: forwardRef(() => DomSanitizerImpl) }]
1861
1850
  }] });
@@ -1917,10 +1906,10 @@ class DomSanitizerImpl extends DomSanitizer {
1917
1906
  bypassSecurityTrustResourceUrl(value) {
1918
1907
  return ɵbypassSanitizationTrustResourceUrl(value);
1919
1908
  }
1920
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomSanitizerImpl, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
1921
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomSanitizerImpl, providedIn: 'root' }); }
1909
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizerImpl, deps: [{ token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
1910
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizerImpl, providedIn: 'root' }); }
1922
1911
  }
1923
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.0", ngImport: i0, type: DomSanitizerImpl, decorators: [{
1912
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0-next.10", ngImport: i0, type: DomSanitizerImpl, decorators: [{
1924
1913
  type: Injectable,
1925
1914
  args: [{ providedIn: 'root' }]
1926
1915
  }], ctorParameters: () => [{ type: undefined, decorators: [{
@@ -1993,7 +1982,6 @@ function withI18nSupport() {
1993
1982
  * providers: [provideClientHydration(withEventReplay())]
1994
1983
  * });
1995
1984
  * ```
1996
- * @developerPreview
1997
1985
  * @publicApi
1998
1986
  * @see {@link provideClientHydration}
1999
1987
  */
@@ -2011,9 +1999,10 @@ function provideZoneJsCompatibilityDetector() {
2011
1999
  provide: ENVIRONMENT_INITIALIZER,
2012
2000
  useValue: () => {
2013
2001
  const ngZone = inject(NgZone);
2002
+ const isZoneless = inject(ɵZONELESS_ENABLED);
2014
2003
  // Checking `ngZone instanceof NgZone` would be insufficient here,
2015
2004
  // because custom implementations might use NgZone as a base class.
2016
- if (ngZone.constructor !== NgZone) {
2005
+ if (!isZoneless && ngZone.constructor !== NgZone) {
2017
2006
  const console = inject(ɵConsole);
2018
2007
  const message = ɵformatRuntimeError(-5000 /* RuntimeErrorCode.UNSUPPORTED_ZONEJS_INSTANCE */, 'Angular detected that hydration was enabled for an application ' +
2019
2008
  'that uses a custom or a noop Zone.js implementation. ' +
@@ -2037,9 +2026,12 @@ function provideZoneJsCompatibilityDetector() {
2037
2026
  * transferring this cache to the client to avoid extra HTTP requests. Learn more about data caching
2038
2027
  * [here](guide/ssr#caching-data-when-using-httpclient).
2039
2028
  *
2040
- * These functions allow you to disable some of the default features or configure features
2029
+ * These functions allow you to disable some of the default features or enable new ones:
2030
+ *
2041
2031
  * * {@link withNoHttpTransferCache} to disable HTTP transfer cache
2042
2032
  * * {@link withHttpTransferCacheOptions} to configure some HTTP transfer cache options
2033
+ * * {@link withI18nSupport} to enable hydration support for i18n blocks
2034
+ * * {@link withEventReplay} to enable support for replaying user events
2043
2035
  *
2044
2036
  * @usageNotes
2045
2037
  *
@@ -2064,6 +2056,8 @@ function provideZoneJsCompatibilityDetector() {
2064
2056
  *
2065
2057
  * @see {@link withNoHttpTransferCache}
2066
2058
  * @see {@link withHttpTransferCacheOptions}
2059
+ * @see {@link withI18nSupport}
2060
+ * @see {@link withEventReplay}
2067
2061
  *
2068
2062
  * @param features Optional features to configure additional router behaviors.
2069
2063
  * @returns A set of providers to enable hydration.
@@ -2105,7 +2099,7 @@ function provideClientHydration(...features) {
2105
2099
  /**
2106
2100
  * @publicApi
2107
2101
  */
2108
- const VERSION = new Version('19.0.0-next.0');
2102
+ const VERSION = new Version('19.0.0-next.10');
2109
2103
 
2110
2104
  /**
2111
2105
  * @module