@angular/cdk 21.0.0-next.9 → 21.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.
Files changed (123) hide show
  1. package/_adev_assets/cdk_drag_drop.json +13 -12
  2. package/_adev_assets/cdk_testing.json +9 -9
  3. package/_adev_assets/cdk_testing_protractor.json +1 -1
  4. package/_adev_assets/cdk_testing_selenium_webdriver.json +1 -1
  5. package/_adev_assets/cdk_testing_testbed.json +1 -1
  6. package/fesm2022/_a11y-module-chunk.mjs +755 -869
  7. package/fesm2022/_a11y-module-chunk.mjs.map +1 -1
  8. package/fesm2022/_activedescendant-key-manager-chunk.mjs +8 -8
  9. package/fesm2022/_activedescendant-key-manager-chunk.mjs.map +1 -1
  10. package/fesm2022/_array-chunk.mjs +1 -1
  11. package/fesm2022/_array-chunk.mjs.map +1 -1
  12. package/fesm2022/_breakpoints-observer-chunk.mjs +149 -152
  13. package/fesm2022/_breakpoints-observer-chunk.mjs.map +1 -1
  14. package/fesm2022/_css-pixel-value-chunk.mjs +4 -5
  15. package/fesm2022/_css-pixel-value-chunk.mjs.map +1 -1
  16. package/fesm2022/_data-source-chunk.mjs +2 -8
  17. package/fesm2022/_data-source-chunk.mjs.map +1 -1
  18. package/fesm2022/_directionality-chunk.mjs +54 -54
  19. package/fesm2022/_directionality-chunk.mjs.map +1 -1
  20. package/fesm2022/_dispose-view-repeater-strategy-chunk.mjs +25 -36
  21. package/fesm2022/_dispose-view-repeater-strategy-chunk.mjs.map +1 -1
  22. package/fesm2022/_element-chunk.mjs +6 -17
  23. package/fesm2022/_element-chunk.mjs.map +1 -1
  24. package/fesm2022/_fake-event-detection-chunk.mjs +3 -17
  25. package/fesm2022/_fake-event-detection-chunk.mjs.map +1 -1
  26. package/fesm2022/_focus-key-manager-chunk.mjs +10 -14
  27. package/fesm2022/_focus-key-manager-chunk.mjs.map +1 -1
  28. package/fesm2022/_focus-monitor-chunk.mjs +376 -566
  29. package/fesm2022/_focus-monitor-chunk.mjs.map +1 -1
  30. package/fesm2022/_id-generator-chunk.mjs +36 -27
  31. package/fesm2022/_id-generator-chunk.mjs.map +1 -1
  32. package/fesm2022/_keycodes-chunk.mjs +9 -9
  33. package/fesm2022/_keycodes-chunk.mjs.map +1 -1
  34. package/fesm2022/_list-key-manager-chunk.mjs +248 -336
  35. package/fesm2022/_list-key-manager-chunk.mjs.map +1 -1
  36. package/fesm2022/_overlay-module-chunk.mjs +2534 -2948
  37. package/fesm2022/_overlay-module-chunk.mjs.map +1 -1
  38. package/fesm2022/_passive-listeners-chunk.mjs +10 -22
  39. package/fesm2022/_passive-listeners-chunk.mjs.map +1 -1
  40. package/fesm2022/_platform-chunk.mjs +42 -65
  41. package/fesm2022/_platform-chunk.mjs.map +1 -1
  42. package/fesm2022/_recycle-view-repeater-strategy-chunk.mjs +78 -134
  43. package/fesm2022/_recycle-view-repeater-strategy-chunk.mjs.map +1 -1
  44. package/fesm2022/_scrolling-chunk.mjs +44 -85
  45. package/fesm2022/_scrolling-chunk.mjs.map +1 -1
  46. package/fesm2022/_selection-model-chunk.mjs +138 -209
  47. package/fesm2022/_selection-model-chunk.mjs.map +1 -1
  48. package/fesm2022/_shadow-dom-chunk.mjs +21 -35
  49. package/fesm2022/_shadow-dom-chunk.mjs.map +1 -1
  50. package/fesm2022/_style-loader-chunk.mjs +50 -37
  51. package/fesm2022/_style-loader-chunk.mjs.map +1 -1
  52. package/fesm2022/_test-environment-chunk.mjs +2 -14
  53. package/fesm2022/_test-environment-chunk.mjs.map +1 -1
  54. package/fesm2022/_tree-key-manager-chunk.mjs +229 -308
  55. package/fesm2022/_tree-key-manager-chunk.mjs.map +1 -1
  56. package/fesm2022/_typeahead-chunk.mjs +52 -74
  57. package/fesm2022/_typeahead-chunk.mjs.map +1 -1
  58. package/fesm2022/_unique-selection-dispatcher-chunk.mjs +43 -40
  59. package/fesm2022/_unique-selection-dispatcher-chunk.mjs.map +1 -1
  60. package/fesm2022/a11y.mjs +351 -449
  61. package/fesm2022/a11y.mjs.map +1 -1
  62. package/fesm2022/accordion.mjs +254 -192
  63. package/fesm2022/accordion.mjs.map +1 -1
  64. package/fesm2022/bidi.mjs +121 -64
  65. package/fesm2022/bidi.mjs.map +1 -1
  66. package/fesm2022/cdk.mjs +1 -2
  67. package/fesm2022/cdk.mjs.map +1 -1
  68. package/fesm2022/clipboard.mjs +208 -186
  69. package/fesm2022/clipboard.mjs.map +1 -1
  70. package/fesm2022/coercion-private.mjs +4 -8
  71. package/fesm2022/coercion-private.mjs.map +1 -1
  72. package/fesm2022/coercion.mjs +11 -29
  73. package/fesm2022/coercion.mjs.map +1 -1
  74. package/fesm2022/dialog.mjs +660 -808
  75. package/fesm2022/dialog.mjs.map +1 -1
  76. package/fesm2022/drag-drop.mjs +3347 -4286
  77. package/fesm2022/drag-drop.mjs.map +1 -1
  78. package/fesm2022/keycodes.mjs +4 -8
  79. package/fesm2022/keycodes.mjs.map +1 -1
  80. package/fesm2022/layout.mjs +44 -26
  81. package/fesm2022/layout.mjs.map +1 -1
  82. package/fesm2022/listbox.mjs +841 -895
  83. package/fesm2022/listbox.mjs.map +1 -1
  84. package/fesm2022/menu.mjs +1942 -1858
  85. package/fesm2022/menu.mjs.map +1 -1
  86. package/fesm2022/observers-private.mjs +88 -106
  87. package/fesm2022/observers-private.mjs.map +1 -1
  88. package/fesm2022/observers.mjs +262 -184
  89. package/fesm2022/observers.mjs.map +1 -1
  90. package/fesm2022/overlay.mjs +72 -68
  91. package/fesm2022/overlay.mjs.map +1 -1
  92. package/fesm2022/platform.mjs +43 -54
  93. package/fesm2022/platform.mjs.map +1 -1
  94. package/fesm2022/portal.mjs +402 -560
  95. package/fesm2022/portal.mjs.map +1 -1
  96. package/fesm2022/private.mjs +38 -10
  97. package/fesm2022/private.mjs.map +1 -1
  98. package/fesm2022/scrolling.mjs +1323 -1400
  99. package/fesm2022/scrolling.mjs.map +1 -1
  100. package/fesm2022/stepper.mjs +758 -590
  101. package/fesm2022/stepper.mjs.map +1 -1
  102. package/fesm2022/table.mjs +2327 -2319
  103. package/fesm2022/table.mjs.map +1 -1
  104. package/fesm2022/testing-selenium-webdriver.mjs +252 -325
  105. package/fesm2022/testing-selenium-webdriver.mjs.map +1 -1
  106. package/fesm2022/testing-testbed.mjs +592 -709
  107. package/fesm2022/testing-testbed.mjs.map +1 -1
  108. package/fesm2022/testing.mjs +368 -889
  109. package/fesm2022/testing.mjs.map +1 -1
  110. package/fesm2022/text-field.mjs +459 -388
  111. package/fesm2022/text-field.mjs.map +1 -1
  112. package/fesm2022/tree.mjs +1483 -1731
  113. package/fesm2022/tree.mjs.map +1 -1
  114. package/overlay/_index.scss +28 -0
  115. package/overlay-prebuilt.css +1 -1
  116. package/package.json +1 -1
  117. package/schematics/ng-add/index.js +1 -1
  118. package/types/_overlay-module-chunk.d.ts +59 -7
  119. package/types/_portal-directives-chunk.d.ts +2 -18
  120. package/types/accordion.d.ts +3 -1
  121. package/types/dialog.d.ts +1 -1
  122. package/types/overlay.d.ts +6 -2
  123. package/types/portal.d.ts +1 -1
@@ -4,207 +4,285 @@ import { Observable, Subject } from 'rxjs';
4
4
  import { map, filter, debounceTime } from 'rxjs/operators';
5
5
  import { coerceNumberProperty, coerceElement } from './_element-chunk.mjs';
6
6
 
7
- // Angular may add, remove, or edit comment nodes during change detection. We don't care about
8
- // these changes because they don't affect the user-preceived content, and worse it can cause
9
- // infinite change detection cycles where the change detection updates a comment, triggering the
10
- // MutationObserver, triggering another change detection and kicking the cycle off again.
11
7
  function shouldIgnoreRecord(record) {
12
- // Ignore changes to comment text.
13
- if (record.type === 'characterData' && record.target instanceof Comment) {
14
- return true;
8
+ if (record.type === 'characterData' && record.target instanceof Comment) {
9
+ return true;
10
+ }
11
+ if (record.type === 'childList') {
12
+ for (let i = 0; i < record.addedNodes.length; i++) {
13
+ if (!(record.addedNodes[i] instanceof Comment)) {
14
+ return false;
15
+ }
15
16
  }
16
- // Ignore addition / removal of comments.
17
- if (record.type === 'childList') {
18
- for (let i = 0; i < record.addedNodes.length; i++) {
19
- if (!(record.addedNodes[i] instanceof Comment)) {
20
- return false;
21
- }
22
- }
23
- for (let i = 0; i < record.removedNodes.length; i++) {
24
- if (!(record.removedNodes[i] instanceof Comment)) {
25
- return false;
26
- }
27
- }
28
- return true;
17
+ for (let i = 0; i < record.removedNodes.length; i++) {
18
+ if (!(record.removedNodes[i] instanceof Comment)) {
19
+ return false;
20
+ }
29
21
  }
30
- // Observe everything else.
31
- return false;
22
+ return true;
23
+ }
24
+ return false;
32
25
  }
33
- /**
34
- * Factory that creates a new MutationObserver and allows us to stub it out in unit tests.
35
- * @docs-private
36
- */
37
26
  class MutationObserverFactory {
38
- create(callback) {
39
- return typeof MutationObserver === 'undefined' ? null : new MutationObserver(callback);
40
- }
41
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: MutationObserverFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
42
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: MutationObserverFactory, providedIn: 'root' });
27
+ create(callback) {
28
+ return typeof MutationObserver === 'undefined' ? null : new MutationObserver(callback);
29
+ }
30
+ static ɵfac = i0.ɵɵngDeclareFactory({
31
+ minVersion: "12.0.0",
32
+ version: "20.2.0-next.2",
33
+ ngImport: i0,
34
+ type: MutationObserverFactory,
35
+ deps: [],
36
+ target: i0.ɵɵFactoryTarget.Injectable
37
+ });
38
+ static ɵprov = i0.ɵɵngDeclareInjectable({
39
+ minVersion: "12.0.0",
40
+ version: "20.2.0-next.2",
41
+ ngImport: i0,
42
+ type: MutationObserverFactory,
43
+ providedIn: 'root'
44
+ });
43
45
  }
44
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: MutationObserverFactory, decorators: [{
45
- type: Injectable,
46
- args: [{ providedIn: 'root' }]
47
- }] });
48
- /** An injectable service that allows watching elements for changes to their content. */
46
+ i0.ɵɵngDeclareClassMetadata({
47
+ minVersion: "12.0.0",
48
+ version: "20.2.0-next.2",
49
+ ngImport: i0,
50
+ type: MutationObserverFactory,
51
+ decorators: [{
52
+ type: Injectable,
53
+ args: [{
54
+ providedIn: 'root'
55
+ }]
56
+ }]
57
+ });
49
58
  class ContentObserver {
50
- _mutationObserverFactory = inject(MutationObserverFactory);
51
- /** Keeps track of the existing MutationObservers so they can be reused. */
52
- _observedElements = new Map();
53
- _ngZone = inject(NgZone);
54
- constructor() { }
55
- ngOnDestroy() {
56
- this._observedElements.forEach((_, element) => this._cleanupObserver(element));
57
- }
58
- observe(elementOrRef) {
59
- const element = coerceElement(elementOrRef);
60
- return new Observable((observer) => {
61
- const stream = this._observeElement(element);
62
- const subscription = stream
63
- .pipe(map(records => records.filter(record => !shouldIgnoreRecord(record))), filter(records => !!records.length))
64
- .subscribe(records => {
65
- this._ngZone.run(() => {
66
- observer.next(records);
67
- });
68
- });
69
- return () => {
70
- subscription.unsubscribe();
71
- this._unobserveElement(element);
72
- };
59
+ _mutationObserverFactory = inject(MutationObserverFactory);
60
+ _observedElements = new Map();
61
+ _ngZone = inject(NgZone);
62
+ constructor() {}
63
+ ngOnDestroy() {
64
+ this._observedElements.forEach((_, element) => this._cleanupObserver(element));
65
+ }
66
+ observe(elementOrRef) {
67
+ const element = coerceElement(elementOrRef);
68
+ return new Observable(observer => {
69
+ const stream = this._observeElement(element);
70
+ const subscription = stream.pipe(map(records => records.filter(record => !shouldIgnoreRecord(record))), filter(records => !!records.length)).subscribe(records => {
71
+ this._ngZone.run(() => {
72
+ observer.next(records);
73
73
  });
74
- }
75
- /**
76
- * Observes the given element by using the existing MutationObserver if available, or creating a
77
- * new one if not.
78
- */
79
- _observeElement(element) {
80
- return this._ngZone.runOutsideAngular(() => {
81
- if (!this._observedElements.has(element)) {
82
- const stream = new Subject();
83
- const observer = this._mutationObserverFactory.create(mutations => stream.next(mutations));
84
- if (observer) {
85
- observer.observe(element, {
86
- characterData: true,
87
- childList: true,
88
- subtree: true,
89
- });
90
- }
91
- this._observedElements.set(element, { observer, stream, count: 1 });
92
- }
93
- else {
94
- this._observedElements.get(element).count++;
95
- }
96
- return this._observedElements.get(element).stream;
97
- });
98
- }
99
- /**
100
- * Un-observes the given element and cleans up the underlying MutationObserver if nobody else is
101
- * observing this element.
102
- */
103
- _unobserveElement(element) {
104
- if (this._observedElements.has(element)) {
105
- this._observedElements.get(element).count--;
106
- if (!this._observedElements.get(element).count) {
107
- this._cleanupObserver(element);
108
- }
74
+ });
75
+ return () => {
76
+ subscription.unsubscribe();
77
+ this._unobserveElement(element);
78
+ };
79
+ });
80
+ }
81
+ _observeElement(element) {
82
+ return this._ngZone.runOutsideAngular(() => {
83
+ if (!this._observedElements.has(element)) {
84
+ const stream = new Subject();
85
+ const observer = this._mutationObserverFactory.create(mutations => stream.next(mutations));
86
+ if (observer) {
87
+ observer.observe(element, {
88
+ characterData: true,
89
+ childList: true,
90
+ subtree: true
91
+ });
109
92
  }
93
+ this._observedElements.set(element, {
94
+ observer,
95
+ stream,
96
+ count: 1
97
+ });
98
+ } else {
99
+ this._observedElements.get(element).count++;
100
+ }
101
+ return this._observedElements.get(element).stream;
102
+ });
103
+ }
104
+ _unobserveElement(element) {
105
+ if (this._observedElements.has(element)) {
106
+ this._observedElements.get(element).count--;
107
+ if (!this._observedElements.get(element).count) {
108
+ this._cleanupObserver(element);
109
+ }
110
110
  }
111
- /** Clean up the underlying MutationObserver for the specified element. */
112
- _cleanupObserver(element) {
113
- if (this._observedElements.has(element)) {
114
- const { observer, stream } = this._observedElements.get(element);
115
- if (observer) {
116
- observer.disconnect();
117
- }
118
- stream.complete();
119
- this._observedElements.delete(element);
120
- }
111
+ }
112
+ _cleanupObserver(element) {
113
+ if (this._observedElements.has(element)) {
114
+ const {
115
+ observer,
116
+ stream
117
+ } = this._observedElements.get(element);
118
+ if (observer) {
119
+ observer.disconnect();
120
+ }
121
+ stream.complete();
122
+ this._observedElements.delete(element);
121
123
  }
122
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: ContentObserver, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
123
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: ContentObserver, providedIn: 'root' });
124
+ }
125
+ static ɵfac = i0.ɵɵngDeclareFactory({
126
+ minVersion: "12.0.0",
127
+ version: "20.2.0-next.2",
128
+ ngImport: i0,
129
+ type: ContentObserver,
130
+ deps: [],
131
+ target: i0.ɵɵFactoryTarget.Injectable
132
+ });
133
+ static ɵprov = i0.ɵɵngDeclareInjectable({
134
+ minVersion: "12.0.0",
135
+ version: "20.2.0-next.2",
136
+ ngImport: i0,
137
+ type: ContentObserver,
138
+ providedIn: 'root'
139
+ });
124
140
  }
125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: ContentObserver, decorators: [{
126
- type: Injectable,
127
- args: [{ providedIn: 'root' }]
128
- }], ctorParameters: () => [] });
129
- /**
130
- * Directive that triggers a callback whenever the content of
131
- * its associated element has changed.
132
- */
141
+ i0.ɵɵngDeclareClassMetadata({
142
+ minVersion: "12.0.0",
143
+ version: "20.2.0-next.2",
144
+ ngImport: i0,
145
+ type: ContentObserver,
146
+ decorators: [{
147
+ type: Injectable,
148
+ args: [{
149
+ providedIn: 'root'
150
+ }]
151
+ }],
152
+ ctorParameters: () => []
153
+ });
133
154
  class CdkObserveContent {
134
- _contentObserver = inject(ContentObserver);
135
- _elementRef = inject(ElementRef);
136
- /** Event emitted for each change in the element's content. */
137
- event = new EventEmitter();
138
- /**
139
- * Whether observing content is disabled. This option can be used
140
- * to disconnect the underlying MutationObserver until it is needed.
141
- */
142
- get disabled() {
143
- return this._disabled;
144
- }
145
- set disabled(value) {
146
- this._disabled = value;
147
- this._disabled ? this._unsubscribe() : this._subscribe();
148
- }
149
- _disabled = false;
150
- /** Debounce interval for emitting the changes. */
151
- get debounce() {
152
- return this._debounce;
153
- }
154
- set debounce(value) {
155
- this._debounce = coerceNumberProperty(value);
156
- this._subscribe();
157
- }
158
- _debounce;
159
- _currentSubscription = null;
160
- constructor() { }
161
- ngAfterContentInit() {
162
- if (!this._currentSubscription && !this.disabled) {
163
- this._subscribe();
164
- }
165
- }
166
- ngOnDestroy() {
167
- this._unsubscribe();
168
- }
169
- _subscribe() {
170
- this._unsubscribe();
171
- const stream = this._contentObserver.observe(this._elementRef);
172
- this._currentSubscription = (this.debounce ? stream.pipe(debounceTime(this.debounce)) : stream).subscribe(this.event);
173
- }
174
- _unsubscribe() {
175
- this._currentSubscription?.unsubscribe();
155
+ _contentObserver = inject(ContentObserver);
156
+ _elementRef = inject(ElementRef);
157
+ event = new EventEmitter();
158
+ get disabled() {
159
+ return this._disabled;
160
+ }
161
+ set disabled(value) {
162
+ this._disabled = value;
163
+ this._disabled ? this._unsubscribe() : this._subscribe();
164
+ }
165
+ _disabled = false;
166
+ get debounce() {
167
+ return this._debounce;
168
+ }
169
+ set debounce(value) {
170
+ this._debounce = coerceNumberProperty(value);
171
+ this._subscribe();
172
+ }
173
+ _debounce;
174
+ _currentSubscription = null;
175
+ constructor() {}
176
+ ngAfterContentInit() {
177
+ if (!this._currentSubscription && !this.disabled) {
178
+ this._subscribe();
176
179
  }
177
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: CdkObserveContent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
178
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "20.2.0-next.2", type: CdkObserveContent, isStandalone: true, selector: "[cdkObserveContent]", inputs: { disabled: ["cdkObserveContentDisabled", "disabled", booleanAttribute], debounce: "debounce" }, outputs: { event: "cdkObserveContent" }, exportAs: ["cdkObserveContent"], ngImport: i0 });
180
+ }
181
+ ngOnDestroy() {
182
+ this._unsubscribe();
183
+ }
184
+ _subscribe() {
185
+ this._unsubscribe();
186
+ const stream = this._contentObserver.observe(this._elementRef);
187
+ this._currentSubscription = (this.debounce ? stream.pipe(debounceTime(this.debounce)) : stream).subscribe(this.event);
188
+ }
189
+ _unsubscribe() {
190
+ this._currentSubscription?.unsubscribe();
191
+ }
192
+ static ɵfac = i0.ɵɵngDeclareFactory({
193
+ minVersion: "12.0.0",
194
+ version: "20.2.0-next.2",
195
+ ngImport: i0,
196
+ type: CdkObserveContent,
197
+ deps: [],
198
+ target: i0.ɵɵFactoryTarget.Directive
199
+ });
200
+ static ɵdir = i0.ɵɵngDeclareDirective({
201
+ minVersion: "16.1.0",
202
+ version: "20.2.0-next.2",
203
+ type: CdkObserveContent,
204
+ isStandalone: true,
205
+ selector: "[cdkObserveContent]",
206
+ inputs: {
207
+ disabled: ["cdkObserveContentDisabled", "disabled", booleanAttribute],
208
+ debounce: "debounce"
209
+ },
210
+ outputs: {
211
+ event: "cdkObserveContent"
212
+ },
213
+ exportAs: ["cdkObserveContent"],
214
+ ngImport: i0
215
+ });
179
216
  }
180
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: CdkObserveContent, decorators: [{
181
- type: Directive,
182
- args: [{
183
- selector: '[cdkObserveContent]',
184
- exportAs: 'cdkObserveContent',
185
- }]
186
- }], ctorParameters: () => [], propDecorators: { event: [{
187
- type: Output,
188
- args: ['cdkObserveContent']
189
- }], disabled: [{
190
- type: Input,
191
- args: [{ alias: 'cdkObserveContentDisabled', transform: booleanAttribute }]
192
- }], debounce: [{
193
- type: Input
194
- }] } });
217
+ i0.ɵɵngDeclareClassMetadata({
218
+ minVersion: "12.0.0",
219
+ version: "20.2.0-next.2",
220
+ ngImport: i0,
221
+ type: CdkObserveContent,
222
+ decorators: [{
223
+ type: Directive,
224
+ args: [{
225
+ selector: '[cdkObserveContent]',
226
+ exportAs: 'cdkObserveContent'
227
+ }]
228
+ }],
229
+ ctorParameters: () => [],
230
+ propDecorators: {
231
+ event: [{
232
+ type: Output,
233
+ args: ['cdkObserveContent']
234
+ }],
235
+ disabled: [{
236
+ type: Input,
237
+ args: [{
238
+ alias: 'cdkObserveContentDisabled',
239
+ transform: booleanAttribute
240
+ }]
241
+ }],
242
+ debounce: [{
243
+ type: Input
244
+ }]
245
+ }
246
+ });
195
247
  class ObserversModule {
196
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: ObserversModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
197
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.2.0-next.2", ngImport: i0, type: ObserversModule, imports: [CdkObserveContent], exports: [CdkObserveContent] });
198
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: ObserversModule, providers: [MutationObserverFactory] });
248
+ static ɵfac = i0.ɵɵngDeclareFactory({
249
+ minVersion: "12.0.0",
250
+ version: "20.2.0-next.2",
251
+ ngImport: i0,
252
+ type: ObserversModule,
253
+ deps: [],
254
+ target: i0.ɵɵFactoryTarget.NgModule
255
+ });
256
+ static ɵmod = i0.ɵɵngDeclareNgModule({
257
+ minVersion: "14.0.0",
258
+ version: "20.2.0-next.2",
259
+ ngImport: i0,
260
+ type: ObserversModule,
261
+ imports: [CdkObserveContent],
262
+ exports: [CdkObserveContent]
263
+ });
264
+ static ɵinj = i0.ɵɵngDeclareInjector({
265
+ minVersion: "12.0.0",
266
+ version: "20.2.0-next.2",
267
+ ngImport: i0,
268
+ type: ObserversModule,
269
+ providers: [MutationObserverFactory]
270
+ });
199
271
  }
200
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.0-next.2", ngImport: i0, type: ObserversModule, decorators: [{
201
- type: NgModule,
202
- args: [{
203
- imports: [CdkObserveContent],
204
- exports: [CdkObserveContent],
205
- providers: [MutationObserverFactory],
206
- }]
207
- }] });
272
+ i0.ɵɵngDeclareClassMetadata({
273
+ minVersion: "12.0.0",
274
+ version: "20.2.0-next.2",
275
+ ngImport: i0,
276
+ type: ObserversModule,
277
+ decorators: [{
278
+ type: NgModule,
279
+ args: [{
280
+ imports: [CdkObserveContent],
281
+ exports: [CdkObserveContent],
282
+ providers: [MutationObserverFactory]
283
+ }]
284
+ }]
285
+ });
208
286
 
209
287
  export { CdkObserveContent, ContentObserver, MutationObserverFactory, ObserversModule };
210
288
  //# sourceMappingURL=observers.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"observers.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/src/cdk/observers/observe-content.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 {NumberInput, coerceElement, coerceNumberProperty} from '../coercion';\nimport {\n AfterContentInit,\n Directive,\n ElementRef,\n EventEmitter,\n Injectable,\n Input,\n NgModule,\n NgZone,\n OnDestroy,\n Output,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport {Observable, Observer, Subject, Subscription} from 'rxjs';\nimport {debounceTime, filter, map} from 'rxjs/operators';\n\n// Angular may add, remove, or edit comment nodes during change detection. We don't care about\n// these changes because they don't affect the user-preceived content, and worse it can cause\n// infinite change detection cycles where the change detection updates a comment, triggering the\n// MutationObserver, triggering another change detection and kicking the cycle off again.\nfunction shouldIgnoreRecord(record: MutationRecord) {\n // Ignore changes to comment text.\n if (record.type === 'characterData' && record.target instanceof Comment) {\n return true;\n }\n // Ignore addition / removal of comments.\n if (record.type === 'childList') {\n for (let i = 0; i < record.addedNodes.length; i++) {\n if (!(record.addedNodes[i] instanceof Comment)) {\n return false;\n }\n }\n for (let i = 0; i < record.removedNodes.length; i++) {\n if (!(record.removedNodes[i] instanceof Comment)) {\n return false;\n }\n }\n return true;\n }\n // Observe everything else.\n return false;\n}\n\n/**\n * Factory that creates a new MutationObserver and allows us to stub it out in unit tests.\n * @docs-private\n */\n@Injectable({providedIn: 'root'})\nexport class MutationObserverFactory {\n create(callback: MutationCallback): MutationObserver | null {\n return typeof MutationObserver === 'undefined' ? null : new MutationObserver(callback);\n }\n}\n\n/** An injectable service that allows watching elements for changes to their content. */\n@Injectable({providedIn: 'root'})\nexport class ContentObserver implements OnDestroy {\n private _mutationObserverFactory = inject(MutationObserverFactory);\n\n /** Keeps track of the existing MutationObservers so they can be reused. */\n private _observedElements = new Map<\n Element,\n {\n observer: MutationObserver | null;\n readonly stream: Subject<MutationRecord[]>;\n count: number;\n }\n >();\n\n private _ngZone = inject(NgZone);\n\n constructor(...args: unknown[]);\n constructor() {}\n\n ngOnDestroy() {\n this._observedElements.forEach((_, element) => this._cleanupObserver(element));\n }\n\n /**\n * Observe content changes on an element.\n * @param element The element to observe for content changes.\n */\n observe(element: Element): Observable<MutationRecord[]>;\n\n /**\n * Observe content changes on an element.\n * @param element The element to observe for content changes.\n */\n observe(element: ElementRef<Element>): Observable<MutationRecord[]>;\n\n observe(elementOrRef: Element | ElementRef<Element>): Observable<MutationRecord[]> {\n const element = coerceElement(elementOrRef);\n\n return new Observable((observer: Observer<MutationRecord[]>) => {\n const stream = this._observeElement(element);\n const subscription = stream\n .pipe(\n map(records => records.filter(record => !shouldIgnoreRecord(record))),\n filter(records => !!records.length),\n )\n .subscribe(records => {\n this._ngZone.run(() => {\n observer.next(records);\n });\n });\n\n return () => {\n subscription.unsubscribe();\n this._unobserveElement(element);\n };\n });\n }\n\n /**\n * Observes the given element by using the existing MutationObserver if available, or creating a\n * new one if not.\n */\n private _observeElement(element: Element): Subject<MutationRecord[]> {\n return this._ngZone.runOutsideAngular(() => {\n if (!this._observedElements.has(element)) {\n const stream = new Subject<MutationRecord[]>();\n const observer = this._mutationObserverFactory.create(mutations => stream.next(mutations));\n if (observer) {\n observer.observe(element, {\n characterData: true,\n childList: true,\n subtree: true,\n });\n }\n this._observedElements.set(element, {observer, stream, count: 1});\n } else {\n this._observedElements.get(element)!.count++;\n }\n return this._observedElements.get(element)!.stream;\n });\n }\n\n /**\n * Un-observes the given element and cleans up the underlying MutationObserver if nobody else is\n * observing this element.\n */\n private _unobserveElement(element: Element) {\n if (this._observedElements.has(element)) {\n this._observedElements.get(element)!.count--;\n if (!this._observedElements.get(element)!.count) {\n this._cleanupObserver(element);\n }\n }\n }\n\n /** Clean up the underlying MutationObserver for the specified element. */\n private _cleanupObserver(element: Element) {\n if (this._observedElements.has(element)) {\n const {observer, stream} = this._observedElements.get(element)!;\n if (observer) {\n observer.disconnect();\n }\n stream.complete();\n this._observedElements.delete(element);\n }\n }\n}\n\n/**\n * Directive that triggers a callback whenever the content of\n * its associated element has changed.\n */\n@Directive({\n selector: '[cdkObserveContent]',\n exportAs: 'cdkObserveContent',\n})\nexport class CdkObserveContent implements AfterContentInit, OnDestroy {\n private _contentObserver = inject(ContentObserver);\n private _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Event emitted for each change in the element's content. */\n @Output('cdkObserveContent') readonly event = new EventEmitter<MutationRecord[]>();\n\n /**\n * Whether observing content is disabled. This option can be used\n * to disconnect the underlying MutationObserver until it is needed.\n */\n @Input({alias: 'cdkObserveContentDisabled', transform: booleanAttribute})\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value: boolean) {\n this._disabled = value;\n this._disabled ? this._unsubscribe() : this._subscribe();\n }\n private _disabled = false;\n\n /** Debounce interval for emitting the changes. */\n @Input()\n get debounce(): number {\n return this._debounce;\n }\n set debounce(value: NumberInput) {\n this._debounce = coerceNumberProperty(value);\n this._subscribe();\n }\n private _debounce: number;\n\n private _currentSubscription: Subscription | null = null;\n\n constructor(...args: unknown[]);\n constructor() {}\n\n ngAfterContentInit() {\n if (!this._currentSubscription && !this.disabled) {\n this._subscribe();\n }\n }\n\n ngOnDestroy() {\n this._unsubscribe();\n }\n\n private _subscribe() {\n this._unsubscribe();\n const stream = this._contentObserver.observe(this._elementRef);\n\n this._currentSubscription = (\n this.debounce ? stream.pipe(debounceTime(this.debounce)) : stream\n ).subscribe(this.event);\n }\n\n private _unsubscribe() {\n this._currentSubscription?.unsubscribe();\n }\n}\n\n@NgModule({\n imports: [CdkObserveContent],\n exports: [CdkObserveContent],\n providers: [MutationObserverFactory],\n})\nexport class ObserversModule {}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"observers.mjs","sources":["../../../../../darwin_arm64-fastbuild-ST-199a4f3c4e20/bin/src/cdk/observers/observe-content.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 {NumberInput, coerceElement, coerceNumberProperty} from '../coercion';\nimport {\n AfterContentInit,\n Directive,\n ElementRef,\n EventEmitter,\n Injectable,\n Input,\n NgModule,\n NgZone,\n OnDestroy,\n Output,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport {Observable, Observer, Subject, Subscription} from 'rxjs';\nimport {debounceTime, filter, map} from 'rxjs/operators';\n\n// Angular may add, remove, or edit comment nodes during change detection. We don't care about\n// these changes because they don't affect the user-preceived content, and worse it can cause\n// infinite change detection cycles where the change detection updates a comment, triggering the\n// MutationObserver, triggering another change detection and kicking the cycle off again.\nfunction shouldIgnoreRecord(record: MutationRecord) {\n // Ignore changes to comment text.\n if (record.type === 'characterData' && record.target instanceof Comment) {\n return true;\n }\n // Ignore addition / removal of comments.\n if (record.type === 'childList') {\n for (let i = 0; i < record.addedNodes.length; i++) {\n if (!(record.addedNodes[i] instanceof Comment)) {\n return false;\n }\n }\n for (let i = 0; i < record.removedNodes.length; i++) {\n if (!(record.removedNodes[i] instanceof Comment)) {\n return false;\n }\n }\n return true;\n }\n // Observe everything else.\n return false;\n}\n\n/**\n * Factory that creates a new MutationObserver and allows us to stub it out in unit tests.\n * @docs-private\n */\n@Injectable({providedIn: 'root'})\nexport class MutationObserverFactory {\n create(callback: MutationCallback): MutationObserver | null {\n return typeof MutationObserver === 'undefined' ? null : new MutationObserver(callback);\n }\n}\n\n/** An injectable service that allows watching elements for changes to their content. */\n@Injectable({providedIn: 'root'})\nexport class ContentObserver implements OnDestroy {\n private _mutationObserverFactory = inject(MutationObserverFactory);\n\n /** Keeps track of the existing MutationObservers so they can be reused. */\n private _observedElements = new Map<\n Element,\n {\n observer: MutationObserver | null;\n readonly stream: Subject<MutationRecord[]>;\n count: number;\n }\n >();\n\n private _ngZone = inject(NgZone);\n\n constructor(...args: unknown[]);\n constructor() {}\n\n ngOnDestroy() {\n this._observedElements.forEach((_, element) => this._cleanupObserver(element));\n }\n\n /**\n * Observe content changes on an element.\n * @param element The element to observe for content changes.\n */\n observe(element: Element): Observable<MutationRecord[]>;\n\n /**\n * Observe content changes on an element.\n * @param element The element to observe for content changes.\n */\n observe(element: ElementRef<Element>): Observable<MutationRecord[]>;\n\n observe(elementOrRef: Element | ElementRef<Element>): Observable<MutationRecord[]> {\n const element = coerceElement(elementOrRef);\n\n return new Observable((observer: Observer<MutationRecord[]>) => {\n const stream = this._observeElement(element);\n const subscription = stream\n .pipe(\n map(records => records.filter(record => !shouldIgnoreRecord(record))),\n filter(records => !!records.length),\n )\n .subscribe(records => {\n this._ngZone.run(() => {\n observer.next(records);\n });\n });\n\n return () => {\n subscription.unsubscribe();\n this._unobserveElement(element);\n };\n });\n }\n\n /**\n * Observes the given element by using the existing MutationObserver if available, or creating a\n * new one if not.\n */\n private _observeElement(element: Element): Subject<MutationRecord[]> {\n return this._ngZone.runOutsideAngular(() => {\n if (!this._observedElements.has(element)) {\n const stream = new Subject<MutationRecord[]>();\n const observer = this._mutationObserverFactory.create(mutations => stream.next(mutations));\n if (observer) {\n observer.observe(element, {\n characterData: true,\n childList: true,\n subtree: true,\n });\n }\n this._observedElements.set(element, {observer, stream, count: 1});\n } else {\n this._observedElements.get(element)!.count++;\n }\n return this._observedElements.get(element)!.stream;\n });\n }\n\n /**\n * Un-observes the given element and cleans up the underlying MutationObserver if nobody else is\n * observing this element.\n */\n private _unobserveElement(element: Element) {\n if (this._observedElements.has(element)) {\n this._observedElements.get(element)!.count--;\n if (!this._observedElements.get(element)!.count) {\n this._cleanupObserver(element);\n }\n }\n }\n\n /** Clean up the underlying MutationObserver for the specified element. */\n private _cleanupObserver(element: Element) {\n if (this._observedElements.has(element)) {\n const {observer, stream} = this._observedElements.get(element)!;\n if (observer) {\n observer.disconnect();\n }\n stream.complete();\n this._observedElements.delete(element);\n }\n }\n}\n\n/**\n * Directive that triggers a callback whenever the content of\n * its associated element has changed.\n */\n@Directive({\n selector: '[cdkObserveContent]',\n exportAs: 'cdkObserveContent',\n})\nexport class CdkObserveContent implements AfterContentInit, OnDestroy {\n private _contentObserver = inject(ContentObserver);\n private _elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n /** Event emitted for each change in the element's content. */\n @Output('cdkObserveContent') readonly event = new EventEmitter<MutationRecord[]>();\n\n /**\n * Whether observing content is disabled. This option can be used\n * to disconnect the underlying MutationObserver until it is needed.\n */\n @Input({alias: 'cdkObserveContentDisabled', transform: booleanAttribute})\n get disabled(): boolean {\n return this._disabled;\n }\n set disabled(value: boolean) {\n this._disabled = value;\n this._disabled ? this._unsubscribe() : this._subscribe();\n }\n private _disabled = false;\n\n /** Debounce interval for emitting the changes. */\n @Input()\n get debounce(): number {\n return this._debounce;\n }\n set debounce(value: NumberInput) {\n this._debounce = coerceNumberProperty(value);\n this._subscribe();\n }\n private _debounce: number;\n\n private _currentSubscription: Subscription | null = null;\n\n constructor(...args: unknown[]);\n constructor() {}\n\n ngAfterContentInit() {\n if (!this._currentSubscription && !this.disabled) {\n this._subscribe();\n }\n }\n\n ngOnDestroy() {\n this._unsubscribe();\n }\n\n private _subscribe() {\n this._unsubscribe();\n const stream = this._contentObserver.observe(this._elementRef);\n\n this._currentSubscription = (\n this.debounce ? stream.pipe(debounceTime(this.debounce)) : stream\n ).subscribe(this.event);\n }\n\n private _unsubscribe() {\n this._currentSubscription?.unsubscribe();\n }\n}\n\n@NgModule({\n imports: [CdkObserveContent],\n exports: [CdkObserveContent],\n providers: [MutationObserverFactory],\n})\nexport class ObserversModule {}\n"],"names":["shouldIgnoreRecord","record","type","i","addedNodes","length","Comment","removedNodes","create","callback","MutationObserver","i0","ɵɵngDeclareClassMetadata","minVersion","version","ngImport","MutationObserverFactory","decorators","Map","NgZone","ngOnDestroy","_observedElements","forEach","_","element","_cleanupObserver","observe","elementOrRef","coerceElement","Observable","observer","_observeElement","subscription","stream","pipe","map","records","filter","subscribe","_ngZone","run","next","unsubscribe","_unobserveElement","has","characterData","set","count","get","disconnect","delete","ɵɵngDeclareFactory","ContentObserver","deps","target","ɵɵFactoryTarget","Injectable","ɵɵngDeclareInjectable","providedIn","args","ctorParameters","inject","disabled","_subscribe","transform","booleanAttribute","ObserversModule","NgModule"],"mappings":"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"}