@skyux/core 8.7.2 → 9.0.0-alpha.1

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 (152) hide show
  1. package/documentation.json +29 -29
  2. package/{esm2020 → esm2022}/lib/modules/adapter-service/adapter.module.mjs +5 -5
  3. package/esm2022/lib/modules/adapter-service/adapter.service.mjs +225 -0
  4. package/esm2022/lib/modules/affix/affix.directive.mjs +116 -0
  5. package/{esm2020 → esm2022}/lib/modules/affix/affix.module.mjs +5 -5
  6. package/esm2022/lib/modules/affix/affix.service.mjs +25 -0
  7. package/esm2022/lib/modules/affix/affixer.mjs +398 -0
  8. package/esm2022/lib/modules/default-input-provider/default-input-provider.mjs +26 -0
  9. package/esm2022/lib/modules/dock/dock-dom-adapter.service.mjs +81 -0
  10. package/esm2022/lib/modules/dock/dock-item.mjs +31 -0
  11. package/esm2022/lib/modules/dock/dock.component.mjs +108 -0
  12. package/{esm2020 → esm2022}/lib/modules/dock/dock.module.mjs +5 -5
  13. package/esm2022/lib/modules/dock/dock.service.mjs +96 -0
  14. package/{esm2020 → esm2022}/lib/modules/dynamic-component/dynamic-component.module.mjs +5 -5
  15. package/esm2022/lib/modules/dynamic-component/dynamic-component.service.mjs +106 -0
  16. package/{esm2020 → esm2022}/lib/modules/format/app-format.mjs +4 -4
  17. package/esm2022/lib/modules/id/id.directive.mjs +31 -0
  18. package/{esm2020 → esm2022}/lib/modules/id/id.module.mjs +5 -5
  19. package/{esm2020 → esm2022}/lib/modules/id/id.service.mjs +4 -4
  20. package/esm2022/lib/modules/layout-host/layout-host.service.mjs +22 -0
  21. package/esm2022/lib/modules/live-announcer/live-announcer.service.mjs +79 -0
  22. package/{esm2020 → esm2022}/lib/modules/log/log.module.mjs +5 -5
  23. package/esm2022/lib/modules/log/log.service.mjs +148 -0
  24. package/{esm2020 → esm2022}/lib/modules/media-query/media-query.module.mjs +5 -5
  25. package/esm2022/lib/modules/media-query/media-query.service.mjs +123 -0
  26. package/{esm2020 → esm2022}/lib/modules/mutation/mutation-observer-service.mjs +4 -4
  27. package/{esm2020 → esm2022}/lib/modules/numeric/numeric.module.mjs +5 -5
  28. package/esm2022/lib/modules/numeric/numeric.pipe.mjs +81 -0
  29. package/esm2022/lib/modules/numeric/numeric.service.mjs +205 -0
  30. package/esm2022/lib/modules/overlay/overlay-adapter.service.mjs +44 -0
  31. package/esm2022/lib/modules/overlay/overlay-instance.mjs +62 -0
  32. package/esm2022/lib/modules/overlay/overlay.component.mjs +193 -0
  33. package/{esm2020 → esm2022}/lib/modules/overlay/overlay.module.mjs +5 -5
  34. package/esm2022/lib/modules/overlay/overlay.service.mjs +124 -0
  35. package/{esm2020 → esm2022}/lib/modules/percent-pipe/percent-pipe.module.mjs +5 -5
  36. package/esm2022/lib/modules/percent-pipe/percent.pipe.mjs +56 -0
  37. package/esm2022/lib/modules/resize-observer/resize-observer-media-query.service.mjs +120 -0
  38. package/esm2022/lib/modules/resize-observer/resize-observer.service.mjs +77 -0
  39. package/esm2022/lib/modules/scrollable-host/scrollable-host.service.mjs +223 -0
  40. package/esm2022/lib/modules/shared/number-format/number-format-utility.mjs +72 -0
  41. package/esm2022/lib/modules/shared/sky-core-resources.module.mjs +50 -0
  42. package/esm2022/lib/modules/title/title.service.mjs +31 -0
  43. package/esm2022/lib/modules/trim/trim.directive.mjs +64 -0
  44. package/{esm2020 → esm2022}/lib/modules/trim/trim.module.mjs +5 -5
  45. package/{esm2020 → esm2022}/lib/modules/ui-config/ui-config.service.mjs +4 -4
  46. package/{esm2020 → esm2022}/lib/modules/viewkeeper/viewkeeper-host-options.mjs +4 -4
  47. package/esm2022/lib/modules/viewkeeper/viewkeeper.directive.mjs +131 -0
  48. package/esm2022/lib/modules/viewkeeper/viewkeeper.mjs +283 -0
  49. package/{esm2020 → esm2022}/lib/modules/viewkeeper/viewkeeper.module.mjs +5 -5
  50. package/esm2022/lib/modules/viewkeeper/viewkeeper.service.mjs +39 -0
  51. package/{esm2020 → esm2022}/lib/modules/window/window-ref.mjs +4 -4
  52. package/esm2022/testing/core-testing.module.mjs +32 -0
  53. package/esm2022/testing/mock-media-query.service.mjs +46 -0
  54. package/{esm2020 → esm2022}/testing/mock-ui-config.service.mjs +4 -4
  55. package/esm2022/testing/overlay/overlay-harness.mjs +43 -0
  56. package/esm2022/testing/shared/component-harness.mjs +13 -0
  57. package/{fesm2020 → fesm2022}/skyux-core-testing.mjs +28 -34
  58. package/{fesm2020 → fesm2022}/skyux-core-testing.mjs.map +1 -1
  59. package/fesm2022/skyux-core.mjs +3858 -0
  60. package/fesm2022/skyux-core.mjs.map +1 -0
  61. package/lib/modules/affix/affix.directive.d.ts +1 -1
  62. package/lib/modules/viewkeeper/viewkeeper.directive.d.ts +1 -1
  63. package/package.json +14 -22
  64. package/esm2020/lib/modules/adapter-service/adapter.service.mjs +0 -227
  65. package/esm2020/lib/modules/affix/affix.directive.mjs +0 -118
  66. package/esm2020/lib/modules/affix/affix.service.mjs +0 -28
  67. package/esm2020/lib/modules/affix/affixer.mjs +0 -377
  68. package/esm2020/lib/modules/default-input-provider/default-input-provider.mjs +0 -31
  69. package/esm2020/lib/modules/dock/dock-dom-adapter.service.mjs +0 -83
  70. package/esm2020/lib/modules/dock/dock-item.mjs +0 -34
  71. package/esm2020/lib/modules/dock/dock.component.mjs +0 -110
  72. package/esm2020/lib/modules/dock/dock.service.mjs +0 -98
  73. package/esm2020/lib/modules/dynamic-component/dynamic-component.service.mjs +0 -109
  74. package/esm2020/lib/modules/id/id.directive.mjs +0 -34
  75. package/esm2020/lib/modules/layout-host/layout-host.service.mjs +0 -27
  76. package/esm2020/lib/modules/live-announcer/live-announcer.service.mjs +0 -80
  77. package/esm2020/lib/modules/log/log.service.mjs +0 -147
  78. package/esm2020/lib/modules/media-query/media-query.service.mjs +0 -124
  79. package/esm2020/lib/modules/numeric/numeric.pipe.mjs +0 -84
  80. package/esm2020/lib/modules/numeric/numeric.service.mjs +0 -179
  81. package/esm2020/lib/modules/overlay/overlay-adapter.service.mjs +0 -47
  82. package/esm2020/lib/modules/overlay/overlay-instance.mjs +0 -65
  83. package/esm2020/lib/modules/overlay/overlay.component.mjs +0 -192
  84. package/esm2020/lib/modules/overlay/overlay.service.mjs +0 -125
  85. package/esm2020/lib/modules/percent-pipe/percent.pipe.mjs +0 -59
  86. package/esm2020/lib/modules/resize-observer/resize-observer-media-query.service.mjs +0 -121
  87. package/esm2020/lib/modules/resize-observer/resize-observer.service.mjs +0 -79
  88. package/esm2020/lib/modules/scrollable-host/scrollable-host.service.mjs +0 -218
  89. package/esm2020/lib/modules/shared/number-format/number-format-utility.mjs +0 -72
  90. package/esm2020/lib/modules/shared/sky-core-resources.module.mjs +0 -50
  91. package/esm2020/lib/modules/title/title.service.mjs +0 -34
  92. package/esm2020/lib/modules/trim/trim.directive.mjs +0 -65
  93. package/esm2020/lib/modules/viewkeeper/viewkeeper.directive.mjs +0 -131
  94. package/esm2020/lib/modules/viewkeeper/viewkeeper.mjs +0 -276
  95. package/esm2020/lib/modules/viewkeeper/viewkeeper.service.mjs +0 -42
  96. package/esm2020/testing/core-testing.module.mjs +0 -32
  97. package/esm2020/testing/mock-media-query.service.mjs +0 -46
  98. package/esm2020/testing/overlay/overlay-harness.mjs +0 -43
  99. package/esm2020/testing/shared/component-harness.mjs +0 -19
  100. package/fesm2015/skyux-core-testing.mjs +0 -209
  101. package/fesm2015/skyux-core-testing.mjs.map +0 -1
  102. package/fesm2015/skyux-core.mjs +0 -3835
  103. package/fesm2015/skyux-core.mjs.map +0 -1
  104. package/fesm2020/skyux-core.mjs +0 -3825
  105. package/fesm2020/skyux-core.mjs.map +0 -1
  106. /package/{esm2020 → esm2022}/index.mjs +0 -0
  107. /package/{esm2020 → esm2022}/lib/modules/adapter-service/focusable-children-options.mjs +0 -0
  108. /package/{esm2020 → esm2022}/lib/modules/affix/affix-auto-fit-context.mjs +0 -0
  109. /package/{esm2020 → esm2022}/lib/modules/affix/affix-config.mjs +0 -0
  110. /package/{esm2020 → esm2022}/lib/modules/affix/affix-horizontal-alignment.mjs +0 -0
  111. /package/{esm2020 → esm2022}/lib/modules/affix/affix-offset-change.mjs +0 -0
  112. /package/{esm2020 → esm2022}/lib/modules/affix/affix-offset.mjs +0 -0
  113. /package/{esm2020 → esm2022}/lib/modules/affix/affix-placement-change.mjs +0 -0
  114. /package/{esm2020 → esm2022}/lib/modules/affix/affix-placement.mjs +0 -0
  115. /package/{esm2020 → esm2022}/lib/modules/affix/affix-position.mjs +0 -0
  116. /package/{esm2020 → esm2022}/lib/modules/affix/affix-rect.mjs +0 -0
  117. /package/{esm2020 → esm2022}/lib/modules/affix/affix-utils.mjs +0 -0
  118. /package/{esm2020 → esm2022}/lib/modules/affix/affix-vertical-alignment.mjs +0 -0
  119. /package/{esm2020 → esm2022}/lib/modules/affix/dom-utils.mjs +0 -0
  120. /package/{esm2020 → esm2022}/lib/modules/dock/dock-insert-component-config.mjs +0 -0
  121. /package/{esm2020 → esm2022}/lib/modules/dock/dock-item-config.mjs +0 -0
  122. /package/{esm2020 → esm2022}/lib/modules/dock/dock-item-reference.mjs +0 -0
  123. /package/{esm2020 → esm2022}/lib/modules/dock/dock-location.mjs +0 -0
  124. /package/{esm2020 → esm2022}/lib/modules/dock/dock-options.mjs +0 -0
  125. /package/{esm2020 → esm2022}/lib/modules/dock/sort-by-stack-order.mjs +0 -0
  126. /package/{esm2020 → esm2022}/lib/modules/dynamic-component/dynamic-component-location.mjs +0 -0
  127. /package/{esm2020 → esm2022}/lib/modules/dynamic-component/dynamic-component-options.mjs +0 -0
  128. /package/{esm2020 → esm2022}/lib/modules/layout-host/layout-host-for-child-args.mjs +0 -0
  129. /package/{esm2020 → esm2022}/lib/modules/live-announcer/types/live-announcer-args.mjs +0 -0
  130. /package/{esm2020 → esm2022}/lib/modules/live-announcer/types/live-announcer-politeness.mjs +0 -0
  131. /package/{esm2020 → esm2022}/lib/modules/log/types/log-deprecation-args.mjs +0 -0
  132. /package/{esm2020 → esm2022}/lib/modules/log/types/log-level-token.mjs +0 -0
  133. /package/{esm2020 → esm2022}/lib/modules/log/types/log-level.mjs +0 -0
  134. /package/{esm2020 → esm2022}/lib/modules/media-query/media-breakpoints.mjs +0 -0
  135. /package/{esm2020 → esm2022}/lib/modules/media-query/media-query-listener.mjs +0 -0
  136. /package/{esm2020 → esm2022}/lib/modules/numeric/numeric-symbol.mjs +0 -0
  137. /package/{esm2020 → esm2022}/lib/modules/numeric/numeric.options.mjs +0 -0
  138. /package/{esm2020 → esm2022}/lib/modules/overlay/overlay-config.mjs +0 -0
  139. /package/{esm2020 → esm2022}/lib/modules/overlay/overlay-context.mjs +0 -0
  140. /package/{esm2020 → esm2022}/lib/modules/overlay/overlay-position.mjs +0 -0
  141. /package/{esm2020 → esm2022}/lib/modules/stacking-context/stacking-context-token.mjs +0 -0
  142. /package/{esm2020 → esm2022}/lib/modules/stacking-context/stacking-context.mjs +0 -0
  143. /package/{esm2020 → esm2022}/lib/modules/title/set-title-args.mjs +0 -0
  144. /package/{esm2020 → esm2022}/lib/modules/viewkeeper/viewkeeper-boundary-info.mjs +0 -0
  145. /package/{esm2020 → esm2022}/lib/modules/viewkeeper/viewkeeper-fixed-styles.mjs +0 -0
  146. /package/{esm2020 → esm2022}/lib/modules/viewkeeper/viewkeeper-offset.mjs +0 -0
  147. /package/{esm2020 → esm2022}/lib/modules/viewkeeper/viewkeeper-options.mjs +0 -0
  148. /package/{esm2020 → esm2022}/skyux-core.mjs +0 -0
  149. /package/{esm2020 → esm2022}/testing/overlay/overlay-harness-filters.mjs +0 -0
  150. /package/{esm2020 → esm2022}/testing/public-api.mjs +0 -0
  151. /package/{esm2020 → esm2022}/testing/shared/harness-filters.mjs +0 -0
  152. /package/{esm2020 → esm2022}/testing/skyux-core-testing.mjs +0 -0
@@ -0,0 +1,398 @@
1
+ import { Subject, fromEvent } from 'rxjs';
2
+ import { SkyAffixAutoFitContext } from './affix-auto-fit-context';
3
+ import { getInversePlacement, getNextPlacement } from './affix-utils';
4
+ import { getElementOffset, getOverflowParents, isOffsetFullyVisibleWithinParent, isOffsetPartiallyVisibleWithinParent, } from './dom-utils';
5
+ const DEFAULT_AFFIX_CONFIG = {
6
+ autoFitContext: SkyAffixAutoFitContext.OverflowParent,
7
+ enableAutoFit: false,
8
+ horizontalAlignment: 'center',
9
+ isSticky: false,
10
+ placement: 'above',
11
+ };
12
+ export class SkyAffixer {
13
+ /**
14
+ * Fires when the affixed element's offset changes.
15
+ */
16
+ get offsetChange() {
17
+ return this.#offsetChangeObs;
18
+ }
19
+ /**
20
+ * Fires when the base element's nearest overflow parent is scrolling. This is useful if you need
21
+ * to perform an additional action during the scroll event but don't want to generate another
22
+ * event listener.
23
+ */
24
+ get overflowScroll() {
25
+ return this.#overflowScrollObs;
26
+ }
27
+ /**
28
+ * Fires when the placement value changes. A `null` value indicates that a suitable
29
+ * placement could not be found.
30
+ */
31
+ get placementChange() {
32
+ return this.#placementChangeObs;
33
+ }
34
+ get #config() {
35
+ return this.#_config;
36
+ }
37
+ set #config(value) {
38
+ const merged = {
39
+ ...DEFAULT_AFFIX_CONFIG,
40
+ ...value,
41
+ };
42
+ // Make sure none of the values are undefined.
43
+ let key;
44
+ for (key in merged) {
45
+ if (merged[key] === undefined) {
46
+ merged[key] = DEFAULT_AFFIX_CONFIG[key];
47
+ }
48
+ }
49
+ this.#_config = merged;
50
+ }
51
+ #affixedElement;
52
+ #baseElement;
53
+ #currentOffset;
54
+ #currentPlacement;
55
+ #offsetChange;
56
+ #offsetChangeObs;
57
+ #overflowParents = [];
58
+ #overflowScroll;
59
+ #overflowScrollObs;
60
+ #placementChange;
61
+ #placementChangeObs;
62
+ #renderer;
63
+ #resizeListener;
64
+ #scrollListeners;
65
+ #_config = DEFAULT_AFFIX_CONFIG;
66
+ constructor(affixedElement, renderer) {
67
+ this.#affixedElement = affixedElement;
68
+ this.#renderer = renderer;
69
+ this.#offsetChange = new Subject();
70
+ this.#overflowScroll = new Subject();
71
+ this.#placementChange = new Subject();
72
+ this.#offsetChangeObs = this.#offsetChange.asObservable();
73
+ this.#overflowScrollObs = this.#overflowScroll.asObservable();
74
+ this.#placementChangeObs = this.#placementChange.asObservable();
75
+ }
76
+ /**
77
+ * Affixes an element to a base element.
78
+ * @param baseElement The base element.
79
+ * @param config Configuration for the affix action.
80
+ */
81
+ affixTo(baseElement, config) {
82
+ this.#reset();
83
+ this.#config = config;
84
+ this.#baseElement = baseElement;
85
+ this.#overflowParents = getOverflowParents(baseElement);
86
+ this.#affix();
87
+ if (this.#config.isSticky) {
88
+ this.#addScrollListeners();
89
+ this.#addResizeListener();
90
+ }
91
+ }
92
+ getConfig() {
93
+ return this.#config;
94
+ }
95
+ /**
96
+ * Re-runs the affix calculation.
97
+ */
98
+ reaffix() {
99
+ // Reset current placement to preferred placement.
100
+ this.#currentPlacement = this.#config.placement;
101
+ this.#affix();
102
+ }
103
+ /**
104
+ * Destroys the affixer.
105
+ */
106
+ destroy() {
107
+ this.#reset();
108
+ this.#placementChange.complete();
109
+ this.#offsetChange.complete();
110
+ this.#overflowScroll.complete();
111
+ }
112
+ #affix() {
113
+ const offset = this.#getOffset();
114
+ if (this.#isNewOffset(offset)) {
115
+ this.#renderer.setStyle(this.#affixedElement, 'top', `${offset.top}px`);
116
+ this.#renderer.setStyle(this.#affixedElement, 'left', `${offset.left}px`);
117
+ this.#offsetChange.next({ offset });
118
+ }
119
+ }
120
+ #getOffset() {
121
+ const parent = this.#getAutoFitContextParent();
122
+ const maxAttempts = 4;
123
+ let attempts = 0;
124
+ let isAffixedElementFullyVisible = false;
125
+ let offset;
126
+ let placement = this.#config.placement;
127
+ const autoFitOverflowOffset = this.#config.autoFitOverflowOffset || {
128
+ bottom: 0,
129
+ left: 0,
130
+ right: 0,
131
+ top: 0,
132
+ };
133
+ if (this.#config.position === 'absolute') {
134
+ autoFitOverflowOffset.top =
135
+ (autoFitOverflowOffset.top || 0) + window.scrollY;
136
+ }
137
+ do {
138
+ offset = this.#getPreferredOffset(placement);
139
+ isAffixedElementFullyVisible = isOffsetFullyVisibleWithinParent(parent, offset, autoFitOverflowOffset);
140
+ if (!this.#config.enableAutoFit) {
141
+ break;
142
+ }
143
+ if (!isAffixedElementFullyVisible) {
144
+ placement =
145
+ attempts % 2 === 0
146
+ ? getInversePlacement(placement)
147
+ : getNextPlacement(placement);
148
+ }
149
+ attempts++;
150
+ } while (!isAffixedElementFullyVisible && attempts < maxAttempts);
151
+ if (isAffixedElementFullyVisible) {
152
+ if (this.#isBaseElementVisible()) {
153
+ this.#notifyPlacementChange(placement);
154
+ }
155
+ else {
156
+ this.#notifyPlacementChange(null);
157
+ }
158
+ return offset;
159
+ }
160
+ if (this.#config.enableAutoFit) {
161
+ this.#notifyPlacementChange(null);
162
+ }
163
+ // No suitable placement was found, so revert to preferred placement.
164
+ return this.#getPreferredOffset(this.#config.placement);
165
+ }
166
+ #getRect(baseElement) {
167
+ const baseDomRect = baseElement.getBoundingClientRect();
168
+ const baseRect = {
169
+ top: baseDomRect.top,
170
+ bottom: baseDomRect.bottom,
171
+ left: baseDomRect.left,
172
+ right: baseDomRect.right,
173
+ width: baseDomRect.width,
174
+ height: baseDomRect.height,
175
+ };
176
+ if (this.#config.position === 'absolute') {
177
+ baseRect.top += window.scrollY;
178
+ baseRect.bottom = baseRect.top + baseDomRect.height;
179
+ }
180
+ return baseRect;
181
+ }
182
+ #getPreferredOffset(placement) {
183
+ if (!this.#baseElement) {
184
+ return { top: 0, left: 0, bottom: 0, right: 0 };
185
+ }
186
+ const affixedRect = this.#getRect(this.#affixedElement);
187
+ const baseRect = this.#getRect(this.#baseElement);
188
+ const horizontalAlignment = this.#config.horizontalAlignment;
189
+ const verticalAlignment = this.#config.verticalAlignment;
190
+ const enableAutoFit = this.#config.enableAutoFit;
191
+ let top;
192
+ let left;
193
+ if (placement === 'above' || placement === 'below') {
194
+ if (placement === 'above') {
195
+ top = baseRect.top - affixedRect.height;
196
+ switch (verticalAlignment) {
197
+ case 'top':
198
+ top = top + affixedRect.height;
199
+ break;
200
+ case 'middle':
201
+ top = top + affixedRect.height / 2;
202
+ break;
203
+ case 'bottom':
204
+ default:
205
+ break;
206
+ }
207
+ }
208
+ else {
209
+ top = baseRect.bottom;
210
+ switch (verticalAlignment) {
211
+ case 'top':
212
+ default:
213
+ break;
214
+ case 'middle':
215
+ top = top - affixedRect.height / 2;
216
+ break;
217
+ case 'bottom':
218
+ top = top - affixedRect.height;
219
+ break;
220
+ }
221
+ }
222
+ switch (horizontalAlignment) {
223
+ case 'left':
224
+ left = baseRect.left;
225
+ break;
226
+ case 'center':
227
+ default:
228
+ left = baseRect.left + baseRect.width / 2 - affixedRect.width / 2;
229
+ break;
230
+ case 'right':
231
+ left = baseRect.right - affixedRect.width;
232
+ break;
233
+ }
234
+ }
235
+ else {
236
+ if (placement === 'left') {
237
+ left = baseRect.left - affixedRect.width;
238
+ }
239
+ else {
240
+ left = baseRect.right;
241
+ }
242
+ switch (verticalAlignment) {
243
+ case 'top':
244
+ top = baseRect.top;
245
+ break;
246
+ case 'middle':
247
+ default:
248
+ top = baseRect.top + baseRect.height / 2 - affixedRect.height / 2;
249
+ break;
250
+ case 'bottom':
251
+ top = baseRect.bottom - affixedRect.height;
252
+ break;
253
+ }
254
+ }
255
+ const offset = { top, left, bottom: 0, right: 0 };
256
+ if (enableAutoFit) {
257
+ const adjustments = this.#adjustOffsetToOverflowParent({ top, left }, placement, this.#baseElement);
258
+ offset.top = adjustments.top;
259
+ offset.left = adjustments.left;
260
+ }
261
+ offset.bottom = offset.top + affixedRect.height;
262
+ offset.right = offset.left + affixedRect.width;
263
+ return offset;
264
+ }
265
+ /**
266
+ * Slightly adjust the offset to fit within the scroll parent's boundaries if
267
+ * the affixed element would otherwise be clipped.
268
+ */
269
+ #adjustOffsetToOverflowParent(offset, placement, baseElement) {
270
+ const parent = this.#getAutoFitContextParent();
271
+ const parentOffset = getElementOffset(parent, this.#config.autoFitOverflowOffset);
272
+ const affixedRect = this.#getRect(this.#affixedElement);
273
+ const baseRect = this.#getRect(baseElement);
274
+ // A pixel value representing the leeway between the edge of the overflow parent and the edge
275
+ // of the base element before it disappears from view.
276
+ // If the visible portion of the base element is less than this pixel value, the auto-fit
277
+ // functionality attempts to find another placement.
278
+ const defaultPixelTolerance = 40;
279
+ let pixelTolerance;
280
+ const originalOffsetTop = offset.top;
281
+ const originalOffsetLeft = offset.left;
282
+ switch (placement) {
283
+ case 'above':
284
+ case 'below':
285
+ // Keep the affixed element within the overflow parent.
286
+ if (offset.left < parentOffset.left) {
287
+ offset.left = parentOffset.left;
288
+ }
289
+ else if (offset.left + affixedRect.width > parentOffset.right) {
290
+ offset.left = parentOffset.right - affixedRect.width;
291
+ }
292
+ // Use a smaller pixel tolerance if the base element width is less than the default.
293
+ pixelTolerance = Math.min(defaultPixelTolerance, baseRect.width);
294
+ // Make sure the affixed element never detaches from the base element.
295
+ if (offset.left + pixelTolerance > baseRect.right ||
296
+ offset.left + affixedRect.width - pixelTolerance < baseRect.left) {
297
+ offset.left = originalOffsetLeft;
298
+ }
299
+ break;
300
+ case 'left':
301
+ case 'right':
302
+ // Keep the affixed element within the overflow parent.
303
+ if (offset.top < parentOffset.top) {
304
+ offset.top = parentOffset.top;
305
+ }
306
+ else if (offset.top + affixedRect.height > parentOffset.bottom) {
307
+ offset.top = parentOffset.bottom - affixedRect.height;
308
+ }
309
+ // Use a smaller pixel tolerance if the base element height is less than the default.
310
+ pixelTolerance = Math.min(defaultPixelTolerance, baseRect.height);
311
+ // Make sure the affixed element never detaches from the base element.
312
+ if (offset.top + pixelTolerance > baseRect.bottom ||
313
+ offset.top + affixedRect.height - pixelTolerance < baseRect.top) {
314
+ offset.top = originalOffsetTop;
315
+ }
316
+ break;
317
+ }
318
+ return offset;
319
+ }
320
+ #getImmediateOverflowParent() {
321
+ return this.#overflowParents[this.#overflowParents.length - 1];
322
+ }
323
+ #getAutoFitContextParent() {
324
+ const bodyElement = this.#overflowParents[0];
325
+ return this.#config.autoFitContext === SkyAffixAutoFitContext.OverflowParent
326
+ ? this.#getImmediateOverflowParent()
327
+ : bodyElement;
328
+ }
329
+ #notifyPlacementChange(placement) {
330
+ if (this.#currentPlacement !== placement) {
331
+ this.#currentPlacement = placement ?? undefined;
332
+ this.#placementChange.next({
333
+ placement,
334
+ });
335
+ }
336
+ }
337
+ #reset() {
338
+ this.#removeScrollListeners();
339
+ this.#removeResizeListener();
340
+ this.#overflowParents = [];
341
+ this.#config =
342
+ this.#baseElement =
343
+ this.#currentPlacement =
344
+ this.#currentOffset =
345
+ undefined;
346
+ }
347
+ #isNewOffset(offset) {
348
+ if (this.#currentOffset === undefined) {
349
+ this.#currentOffset = offset;
350
+ return true;
351
+ }
352
+ if (this.#currentOffset.top === offset.top &&
353
+ this.#currentOffset.left === offset.left) {
354
+ return false;
355
+ }
356
+ this.#currentOffset = offset;
357
+ return true;
358
+ }
359
+ #isBaseElementVisible() {
360
+ if (!this.#baseElement) {
361
+ return false;
362
+ }
363
+ const baseRect = this.#baseElement.getBoundingClientRect();
364
+ return isOffsetPartiallyVisibleWithinParent(this.#getImmediateOverflowParent(), {
365
+ top: baseRect.top,
366
+ left: baseRect.left,
367
+ right: baseRect.right,
368
+ bottom: baseRect.bottom,
369
+ }, this.#config.autoFitOverflowOffset);
370
+ }
371
+ #addScrollListeners() {
372
+ this.#scrollListeners = this.#overflowParents.map((parentElement) => {
373
+ const overflow = parentElement === document.body ? 'window' : parentElement;
374
+ return this.#renderer.listen(overflow, 'scroll', () => {
375
+ this.#affix();
376
+ this.#overflowScroll.next();
377
+ });
378
+ });
379
+ }
380
+ #addResizeListener() {
381
+ this.#resizeListener = fromEvent(window, 'resize').subscribe(() => this.#affix());
382
+ }
383
+ #removeResizeListener() {
384
+ if (this.#resizeListener) {
385
+ this.#resizeListener.unsubscribe();
386
+ this.#resizeListener = undefined;
387
+ }
388
+ }
389
+ #removeScrollListeners() {
390
+ if (this.#scrollListeners) {
391
+ // Remove renderer-generated listeners by calling the listener itself.
392
+ // https://github.com/angular/angular/issues/9368#issuecomment-227199778
393
+ this.#scrollListeners.forEach((listener) => listener());
394
+ this.#scrollListeners = undefined;
395
+ }
396
+ }
397
+ }
398
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWZmaXhlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jb3JlL3NyYy9saWIvbW9kdWxlcy9hZmZpeC9hZmZpeGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBYyxPQUFPLEVBQWdCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVwRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQU9sRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsZ0NBQWdDLEVBQ2hDLG9DQUFvQyxHQUNyQyxNQUFNLGFBQWEsQ0FBQztBQWtCckIsTUFBTSxvQkFBb0IsR0FBMEI7SUFDbEQsY0FBYyxFQUFFLHNCQUFzQixDQUFDLGNBQWM7SUFDckQsYUFBYSxFQUFFLEtBQUs7SUFDcEIsbUJBQW1CLEVBQUUsUUFBUTtJQUM3QixRQUFRLEVBQUUsS0FBSztJQUNmLFNBQVMsRUFBRSxPQUFPO0NBQ25CLENBQUM7QUFFRixNQUFNLE9BQU8sVUFBVTtJQUNyQjs7T0FFRztJQUNILElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLEtBQWlDO1FBQzNDLE1BQU0sTUFBTSxHQUEwQjtZQUNwQyxHQUFH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QVEsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FDaEUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUNkLENBQUM7SUFDSixDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQUVELHNCQUFzQjtRQUNwQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixzRUFBc0U7WUFDdEUsd0VBQXdFO1lBQ3hFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztTQUNuQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTa3lBZmZpeEF1dG9GaXRDb250ZXh0IH0gZnJvbSAnLi9hZmZpeC1hdXRvLWZpdC1jb250ZXh0JztcbmltcG9ydCB7IFNreUFmZml4Q29uZmlnIH0gZnJvbSAnLi9hZmZpeC1jb25maWcnO1xuaW1wb3J0IHsgU2t5QWZmaXhPZmZzZXQgfSBmcm9tICcuL2FmZml4LW9mZnNldCc7XG5pbXBvcnQgeyBTa3lBZmZpeE9mZnNldENoYW5nZSB9IGZyb20gJy4vYWZmaXgtb2Zmc2V0LWNoYW5nZSc7XG5pbXBvcnQgeyBTa3lBZmZpeFBsYWNlbWVudCB9IGZyb20gJy4vYWZmaXgtcGxhY2VtZW50JztcbmltcG9ydCB7IFNreUFmZml4UGxhY2VtZW50Q2hhbmdlIH0gZnJvbSAnLi9hZmZpeC1wbGFjZW1lbnQtY2hhbmdlJztcbmltcG9ydCB7IEFmZml4UmVjdCB9IGZyb20gJy4vYWZmaXgtcmVjdCc7XG5pbXBvcnQgeyBnZXRJbnZlcnNlUGxhY2VtZW50LCBnZXROZXh0UGxhY2VtZW50IH0gZnJvbSAnLi9hZmZpeC11dGlscyc7XG5pbXBvcnQge1xuICBnZXRFbGVtZW50T2Zmc2V0LFxuICBnZXRPdmVyZmxvd1BhcmVudHMsXG4gIGlzT2Zmc2V0RnVsbHlWaXNpYmxlV2l0aGluUGFyZW50LFxuICBpc09mZnNldFBhcnRpYWxseVZpc2libGVXaXRoaW5QYXJlbnQsXG59IGZyb20gJy4vZG9tLXV0aWxzJztcblxuLyoqXG4gKiBNYWtlIHNwZWNpZmljIHByb3BlcnRpZXMgcmVxdWlyZWQsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0b1xuICogZG8gbnVsbCBjaGVja3MgdGhyb3VnaG91dCB0aGlzIGZpbGUuXG4gKi9cbnR5cGUgQWZmaXhDb25maWdPckRlZmF1bHRzID0gU2t5QWZmaXhDb25maWcgJlxuICBSZXF1aXJlZDxcbiAgICBQaWNrPFxuICAgICAgU2t5QWZmaXhDb25maWcsXG4gICAgICB8ICdhdXRvRml0Q29udGV4dCdcbiAgICAgIHwgJ2VuYWJsZUF1dG9GaXQnXG4gICAgICB8ICdob3Jpem9udGFsQWxpZ25tZW50J1xuICAgICAgfCAnaXNTdGlja3knXG4gICAgICB8ICdwbGFjZW1lbnQnXG4gICAgPlxuICA+O1xuXG5jb25zdCBERUZBVUxUX0FGRklYX0NPTkZJRzogQWZmaXhDb25maWdPckRlZmF1bHRzID0ge1xuICBhdXRvRml0Q29udGV4dDogU2t5QWZmaXhBdXRvRml0Q29udGV4dC5PdmVyZmxvd1BhcmVudCxcbiAgZW5hYmxlQXV0b0ZpdDogZmFsc2UsXG4gIGhvcml6b250YWxBbGlnbm1lbnQ6ICdjZW50ZXInLFxuICBpc1N0aWNreTogZmFsc2UsXG4gIHBsYWNlbWVudDogJ2Fib3ZlJyxcbn07XG5cbmV4cG9ydCBjbGFzcyBTa3lBZmZpeGVyIHtcbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIGFmZml4ZWQgZWxlbWVudCdzIG9mZnNldCBjaGFuZ2VzLlxuICAgKi9cbiAgcHVibGljIGdldCBvZmZzZXRDaGFuZ2UoKTogT2JzZXJ2YWJsZTxTa3lBZmZpeE9mZnNldENoYW5nZT4ge1xuICAgIHJldHVybiB0aGlzLiNvZmZzZXRDaGFuZ2VPYnM7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgYmFzZSBlbGVtZW50J3MgbmVhcmVzdCBvdmVyZmxvdyBwYXJlbnQgaXMgc2Nyb2xsaW5nLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgbmVlZFxuICAgKiB0byBwZXJmb3JtIGFuIGFkZGl0aW9uYWwgYWN0aW9uIGR1cmluZyB0aGUgc2Nyb2xsIGV2ZW50IGJ1dCBkb24ndCB3YW50IHRvIGdlbmVyYXRlIGFub3RoZXJcbiAgICogZXZlbnQgbGlzdGVuZXIuXG4gICAqL1xuICBwdWJsaWMgZ2V0IG92ZXJmbG93U2Nyb2xsKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLiNvdmVyZmxvd1Njcm9sbE9icztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBwbGFjZW1lbnQgdmFsdWUgY2hhbmdlcy4gQSBgbnVsbGAgdmFsdWUgaW5kaWNhdGVzIHRoYXQgYSBzdWl0YWJsZVxuICAgKiBwbGFjZW1lbnQgY291bGQgbm90IGJlIGZvdW5kLlxuICAgKi9cbiAgcHVibGljIGdldCBwbGFjZW1lbnRDaGFuZ2UoKTogT2JzZXJ2YWJsZTxTa3lBZmZpeFBsYWNlbWVudENoYW5nZT4ge1xuICAgIHJldHVybiB0aGlzLiNwbGFjZW1lbnRDaGFuZ2VPYnM7XG4gIH1cblxuICBnZXQgI2NvbmZpZygpOiBBZmZpeENvbmZpZ09yRGVmYXVsdHMge1xuICAgIHJldHVybiB0aGlzLiNfY29uZmlnO1xuICB9XG5cbiAgc2V0ICNjb25maWcodmFsdWU6IFNreUFmZml4Q29uZmlnIHwgdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbWVyZ2VkOiBBZmZpeENvbmZpZ09yRGVmYXVsdHMgPSB7XG4gICAgICAuLi5ERUZBVUxUX0FGRklYX0NPTkZJRyxcbiAgICAgIC4uLnZhbHVlLFxuICAgIH07XG5cbiAgICAvLyBNYWtlIHN1cmUgbm9uZSBvZiB0aGUgdmFsdWVzIGFyZSB1bmRlZmluZWQuXG4gICAgbGV0IGtleToga2V5b2YgdHlwZW9mIG1lcmdlZDtcbiAgICBmb3IgKGtleSBpbiBtZXJnZWQpIHtcbiAgICAgIGlmIChtZXJnZWRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChtZXJnZWQgYXMgYW55KVtrZXldID0gREVGQVVMVF9BRkZJWF9DT05GSUdba2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLiNfY29uZmlnID0gbWVyZ2VkO1xuICB9XG5cbiAgI2FmZml4ZWRFbGVtZW50OiBIVE1MRWxlbWVudDtcblxuICAjYmFzZUVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gICNjdXJyZW50T2Zmc2V0OiBTa3lBZmZpeE9mZnNldCB8IHVuZGVmaW5lZDtcblxuICAjY3VycmVudFBsYWNlbWVudDogU2t5QWZmaXhQbGFjZW1lbnQgfCB1bmRlZmluZWQ7XG5cbiAgI29mZnNldENoYW5nZTogU3ViamVjdDxTa3lBZmZpeE9mZnNldENoYW5nZT47XG5cbiAgI29mZnNldENoYW5nZU9iczogT2JzZXJ2YWJsZTxTa3lBZmZpeE9mZnNldENoYW5nZT47XG5cbiAgI292ZXJmbG93UGFyZW50czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICNvdmVyZmxvd1Njcm9sbDogU3ViamVjdDx2b2lkPjtcblxuICAjb3ZlcmZsb3dTY3JvbGxPYnM6IE9ic2VydmFibGU8dm9pZD47XG5cbiAgI3BsYWNlbWVudENoYW5nZTogU3ViamVjdDxTa3lBZmZpeFBsYWNlbWVudENoYW5nZT47XG5cbiAgI3BsYWNlbWVudENoYW5nZU9iczogT2JzZXJ2YWJsZTxTa3lBZmZpeFBsYWNlbWVudENoYW5nZT47XG5cbiAgI3JlbmRlcmVyOiBSZW5kZXJlcjI7XG5cbiAgI3Jlc2l6ZUxpc3RlbmVyOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgI3Njcm9sbExpc3RlbmVyczogKCgpID0+IHZvaWQpW10gfCB1bmRlZmluZWQ7XG5cbiAgI19jb25maWc6IEFmZml4Q29uZmlnT3JEZWZhdWx0cyA9IERFRkFVTFRfQUZGSVhfQ09ORklHO1xuXG4gIGNvbnN0cnVjdG9yKGFmZml4ZWRFbGVtZW50OiBIVE1MRWxlbWVudCwgcmVuZGVyZXI6IFJlbmRlcmVyMikge1xuICAgIHRoaXMuI2FmZml4ZWRFbGVtZW50ID0gYWZmaXhlZEVsZW1lbnQ7XG4gICAgdGhpcy4jcmVuZGVyZXIgPSByZW5kZXJlcjtcblxuICAgIHRoaXMuI29mZnNldENoYW5nZSA9IG5ldyBTdWJqZWN0PFNreUFmZml4T2Zmc2V0Q2hhbmdlPigpO1xuICAgIHRoaXMuI292ZXJmbG93U2Nyb2xsID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICB0aGlzLiNwbGFjZW1lbnRDaGFuZ2UgPSBuZXcgU3ViamVjdDxTa3lBZmZpeFBsYWNlbWVudENoYW5nZT4oKTtcblxuICAgIHRoaXMuI29mZnNldENoYW5nZU9icyA9IHRoaXMuI29mZnNldENoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLiNvdmVyZmxvd1Njcm9sbE9icyA9IHRoaXMuI292ZXJmbG93U2Nyb2xsLmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuI3BsYWNlbWVudENoYW5nZU9icyA9IHRoaXMuI3BsYWNlbWVudENoYW5nZS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZmZpeGVzIGFuIGVsZW1lbnQgdG8gYSBiYXNlIGVsZW1lbnQuXG4gICAqIEBwYXJhbSBiYXNlRWxlbWVudCBUaGUgYmFzZSBlbGVtZW50LlxuICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBhZmZpeCBhY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgYWZmaXhUbyhiYXNlRWxlbWVudDogSFRNTEVsZW1lbnQsIGNvbmZpZz86IFNreUFmZml4Q29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy4jcmVzZXQoKTtcblxuICAgIHRoaXMuI2NvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLiNiYXNlRWxlbWVudCA9IGJhc2VFbGVtZW50O1xuICAgIHRoaXMuI292ZXJmbG93UGFyZW50cyA9IGdldE92ZXJmbG93UGFyZW50cyhiYXNlRWxlbWVudCk7XG5cbiAgICB0aGlzLiNhZmZpeCgpO1xuXG4gICAgaWYgKHRoaXMuI2NvbmZpZy5pc1N0aWNreSkge1xuICAgICAgdGhpcy4jYWRkU2Nyb2xsTGlzdGVuZXJzKCk7XG4gICAgICB0aGlzLiNhZGRSZXNpemVMaXN0ZW5lcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25maWcoKTogU2t5QWZmaXhDb25maWcge1xuICAgIHJldHVybiB0aGlzLiNjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogUmUtcnVucyB0aGUgYWZmaXggY2FsY3VsYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZmZpeCgpOiB2b2lkIHtcbiAgICAvLyBSZXNldCBjdXJyZW50IHBsYWNlbWVudCB0byBwcmVmZXJyZWQgcGxhY2VtZW50LlxuICAgIHRoaXMuI2N1cnJlbnRQbGFjZW1lbnQgPSB0aGlzLiNjb25maWcucGxhY2VtZW50O1xuICAgIHRoaXMuI2FmZml4KCk7XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveXMgdGhlIGFmZml4ZXIuXG4gICAqL1xuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiNyZXNldCgpO1xuICAgIHRoaXMuI3BsYWNlbWVudENoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuI29mZnNldENoYW5nZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuI292ZXJmbG93U2Nyb2xsLmNvbXBsZXRlKCk7XG4gIH1cblxuICAjYWZmaXgoKTogdm9pZCB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy4jZ2V0T2Zmc2V0KCk7XG5cbiAgICBpZiAodGhpcy4jaXNOZXdPZmZzZXQob2Zmc2V0KSkge1xuICAgICAgdGhpcy4jcmVuZGVyZXIuc2V0U3R5bGUodGhpcy4jYWZmaXhlZEVsZW1lbnQsICd0b3AnLCBgJHtvZmZzZXQudG9wfXB4YCk7XG4gICAgICB0aGlzLiNyZW5kZXJlci5zZXRTdHlsZSh0aGlzLiNhZmZpeGVkRWxlbWVudCwgJ2xlZnQnLCBgJHtvZmZzZXQubGVmdH1weGApO1xuXG4gICAgICB0aGlzLiNvZmZzZXRDaGFuZ2UubmV4dCh7IG9mZnNldCB9KTtcbiAgICB9XG4gIH1cblxuICAjZ2V0T2Zmc2V0KCk6IFNreUFmZml4T2Zmc2V0IHtcbiAgICBjb25zdCBwYXJlbnQgPSB0aGlzLiNnZXRBdXRvRml0Q29udGV4dFBhcmVudCgpO1xuXG4gICAgY29uc3QgbWF4QXR0ZW1wdHMgPSA0O1xuICAgIGxldCBhdHRlbXB0cyA9IDA7XG5cbiAgICBsZXQgaXNBZmZpeGVkRWxlbWVudEZ1bGx5VmlzaWJsZSA9IGZhbHNlO1xuICAgIGxldCBvZmZzZXQ6IFJlcXVpcmVkPFNreUFmZml4T2Zmc2V0PjtcbiAgICBsZXQgcGxhY2VtZW50ID0gdGhpcy4jY29uZmlnLnBsYWNlbWVudDtcblxuICAgIGNvbnN0IGF1dG9GaXRPdmVyZmxvd09mZnNldCA9IHRoaXMuI2NvbmZpZy5hdXRvRml0T3ZlcmZsb3dPZmZzZXQgfHwge1xuICAgICAgYm90dG9tOiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgdG9wOiAwLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy4jY29uZmlnLnBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICBhdXRvRml0T3ZlcmZsb3dPZmZzZXQudG9wID1cbiAgICAgICAgKGF1dG9GaXRPdmVyZmxvd09mZnNldC50b3AgfHwgMCkgKyB3aW5kb3cuc2Nyb2xsWTtcbiAgICB9XG5cbiAgICBkbyB7XG4gICAgICBvZmZzZXQgPSB0aGlzLiNnZXRQcmVmZXJyZWRPZmZzZXQocGxhY2VtZW50KTtcbiAgICAgIGlzQWZmaXhlZEVsZW1lbnRGdWxseVZpc2libGUgPSBpc09mZnNldEZ1bGx5VmlzaWJsZVdpdGhpblBhcmVudChcbiAgICAgICAgcGFyZW50LFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIGF1dG9GaXRPdmVyZmxvd09mZnNldFxuICAgICAgKTtcblxuICAgICAgaWYgKCF0aGlzLiNjb25maWcuZW5hYmxlQXV0b0ZpdCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0FmZml4ZWRFbGVtZW50RnVsbHlWaXNpYmxlKSB7XG4gICAgICAgIHBsYWNlbWVudCA9XG4gICAgICAgICAgYXR0ZW1wdHMgJSAyID09PSAwXG4gICAgICAgICAgICA/IGdldEludmVyc2VQbGFjZW1lbnQocGxhY2VtZW50KVxuICAgICAgICAgICAgOiBnZXROZXh0UGxhY2VtZW50KHBsYWNlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIGF0dGVtcHRzKys7XG4gICAgfSB3aGlsZSAoIWlzQWZmaXhlZEVsZW1lbnRGdWxseVZpc2libGUgJiYgYXR0ZW1wdHMgPCBtYXhBdHRlbXB0cyk7XG5cbiAgICBpZiAoaXNBZmZpeGVkRWxlbWVudEZ1bGx5VmlzaWJsZSkge1xuICAgICAgaWYgKHRoaXMuI2lzQmFzZUVsZW1lbnRWaXNpYmxlKCkpIHtcbiAgICAgICAgdGhpcy4jbm90aWZ5UGxhY2VtZW50Q2hhbmdlKHBsYWNlbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLiNub3RpZnlQbGFjZW1lbnRDaGFuZ2UobnVsbCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuI2NvbmZpZy5lbmFibGVBdXRvRml0KSB7XG4gICAgICB0aGlzLiNub3RpZnlQbGFjZW1lbnRDaGFuZ2UobnVsbCk7XG4gICAgfVxuXG4gICAgLy8gTm8gc3VpdGFibGUgcGxhY2VtZW50IHdhcyBmb3VuZCwgc28gcmV2ZXJ0IHRvIHByZWZlcnJlZCBwbGFjZW1lbnQuXG4gICAgcmV0dXJuIHRoaXMuI2dldFByZWZlcnJlZE9mZnNldCh0aGlzLiNjb25maWcucGxhY2VtZW50KTtcbiAgfVxuXG4gICNnZXRSZWN0KGJhc2VFbGVtZW50OiBIVE1MRWxlbWVudCk6IEFmZml4UmVjdCB7XG4gICAgY29uc3QgYmFzZURvbVJlY3QgPSBiYXNlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIGNvbnN0IGJhc2VSZWN0OiBBZmZpeFJlY3QgPSB7XG4gICAgICB0b3A6IGJhc2VEb21SZWN0LnRvcCxcbiAgICAgIGJvdHRvbTogYmFzZURvbVJlY3QuYm90dG9tLFxuICAgICAgbGVmdDogYmFzZURvbVJlY3QubGVmdCxcbiAgICAgIHJpZ2h0OiBiYXNlRG9tUmVjdC5yaWdodCxcbiAgICAgIHdpZHRoOiBiYXNlRG9tUmVjdC53aWR0aCxcbiAgICAgIGhlaWdodDogYmFzZURvbVJlY3QuaGVpZ2h0LFxuICAgIH07XG5cbiAgICBpZiAodGhpcy4jY29uZmlnLnBvc2l0aW9uID09PSAnYWJzb2x1dGUnKSB7XG4gICAgICBiYXNlUmVjdC50b3AgKz0gd2luZG93LnNjcm9sbFk7XG4gICAgICBiYXNlUmVjdC5ib3R0b20gPSBiYXNlUmVjdC50b3AgKyBiYXNlRG9tUmVjdC5oZWlnaHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJhc2VSZWN0O1xuICB9XG5cbiAgI2dldFByZWZlcnJlZE9mZnNldChwbGFjZW1lbnQ6IFNreUFmZml4UGxhY2VtZW50KTogUmVxdWlyZWQ8U2t5QWZmaXhPZmZzZXQ+IHtcbiAgICBpZiAoIXRoaXMuI2Jhc2VFbGVtZW50KSB7XG4gICAgICByZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAsIGJvdHRvbTogMCwgcmlnaHQ6IDAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBhZmZpeGVkUmVjdCA9IHRoaXMuI2dldFJlY3QodGhpcy4jYWZmaXhlZEVsZW1lbnQpO1xuICAgIGNvbnN0IGJhc2VSZWN0ID0gdGhpcy4jZ2V0UmVjdCh0aGlzLiNiYXNlRWxlbWVudCk7XG5cbiAgICBjb25zdCBob3Jpem9udGFsQWxpZ25tZW50ID0gdGhpcy4jY29uZmlnLmhvcml6b250YWxBbGlnbm1lbnQ7XG4gICAgY29uc3QgdmVydGljYWxBbGlnbm1lbnQgPSB0aGlzLiNjb25maWcudmVydGljYWxBbGlnbm1lbnQ7XG4gICAgY29uc3QgZW5hYmxlQXV0b0ZpdCA9IHRoaXMuI2NvbmZpZy5lbmFibGVBdXRvRml0O1xuXG4gICAgbGV0IHRvcDogbnVtYmVyO1xuICAgIGxldCBsZWZ0OiBudW1iZXI7XG5cbiAgICBpZiAocGxhY2VtZW50ID09PSAnYWJvdmUnIHx8IHBsYWNlbWVudCA9PT0gJ2JlbG93Jykge1xuICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ2Fib3ZlJykge1xuICAgICAgICB0b3AgPSBiYXNlUmVjdC50b3AgLSBhZmZpeGVkUmVjdC5oZWlnaHQ7XG5cbiAgICAgICAgc3dpdGNoICh2ZXJ0aWNhbEFsaWdubWVudCkge1xuICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgICB0b3AgPSB0b3AgKyBhZmZpeGVkUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdtaWRkbGUnOlxuICAgICAgICAgICAgdG9wID0gdG9wICsgYWZmaXhlZFJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0b3AgPSBiYXNlUmVjdC5ib3R0b207XG5cbiAgICAgICAgc3dpdGNoICh2ZXJ0aWNhbEFsaWdubWVudCkge1xuICAgICAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ21pZGRsZSc6XG4gICAgICAgICAgICB0b3AgPSB0b3AgLSBhZmZpeGVkUmVjdC5oZWlnaHQgLyAyO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnYm90dG9tJzpcbiAgICAgICAgICAgIHRvcCA9IHRvcCAtIGFmZml4ZWRSZWN0LmhlaWdodDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoaG9yaXpvbnRhbEFsaWdubWVudCkge1xuICAgICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgICBsZWZ0ID0gYmFzZVJlY3QubGVmdDtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdjZW50ZXInOlxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGxlZnQgPSBiYXNlUmVjdC5sZWZ0ICsgYmFzZVJlY3Qud2lkdGggLyAyIC0gYWZmaXhlZFJlY3Qud2lkdGggLyAyO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgICBsZWZ0ID0gYmFzZVJlY3QucmlnaHQgLSBhZmZpeGVkUmVjdC53aWR0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7XG4gICAgICAgIGxlZnQgPSBiYXNlUmVjdC5sZWZ0IC0gYWZmaXhlZFJlY3Qud2lkdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZWZ0ID0gYmFzZVJlY3QucmlnaHQ7XG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAodmVydGljYWxBbGlnbm1lbnQpIHtcbiAgICAgICAgY2FzZSAndG9wJzpcbiAgICAgICAgICB0b3AgPSBiYXNlUmVjdC50b3A7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbWlkZGxlJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0b3AgPSBiYXNlUmVjdC50b3AgKyBiYXNlUmVjdC5oZWlnaHQgLyAyIC0gYWZmaXhlZFJlY3QuaGVpZ2h0IC8gMjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICAgIHRvcCA9IGJhc2VSZWN0LmJvdHRvbSAtIGFmZml4ZWRSZWN0LmhlaWdodDtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvZmZzZXQ6IFJlcXVpcmVkPFNreUFmZml4T2Zmc2V0PiA9IHsgdG9wLCBsZWZ0LCBib3R0b206IDAsIHJpZ2h0OiAwIH07XG5cbiAgICBpZiAoZW5hYmxlQXV0b0ZpdCkge1xuICAgICAgY29uc3QgYWRqdXN0bWVudHMgPSB0aGlzLiNhZGp1c3RPZmZzZXRUb092ZXJmbG93UGFyZW50KFxuICAgICAgICB7IHRvcCwgbGVmdCB9LFxuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIHRoaXMuI2Jhc2VFbGVtZW50XG4gICAgICApO1xuICAgICAgb2Zmc2V0LnRvcCA9IGFkanVzdG1lbnRzLnRvcDtcbiAgICAgIG9mZnNldC5sZWZ0ID0gYWRqdXN0bWVudHMubGVmdDtcbiAgICB9XG5cbiAgICBvZmZzZXQuYm90dG9tID0gb2Zmc2V0LnRvcCArIGFmZml4ZWRSZWN0LmhlaWdodDtcbiAgICBvZmZzZXQucmlnaHQgPSBvZmZzZXQubGVmdCArIGFmZml4ZWRSZWN0LndpZHRoO1xuXG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTbGlnaHRseSBhZGp1c3QgdGhlIG9mZnNldCB0byBmaXQgd2l0aGluIHRoZSBzY3JvbGwgcGFyZW50J3MgYm91bmRhcmllcyBpZlxuICAgKiB0aGUgYWZmaXhlZCBlbGVtZW50IHdvdWxkIG90aGVyd2lzZSBiZSBjbGlwcGVkLlxuICAgKi9cbiAgI2FkanVzdE9mZnNldFRvT3ZlcmZsb3dQYXJlbnQoXG4gICAgb2Zmc2V0OiB7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfSxcbiAgICBwbGFjZW1lbnQ6IFNreUFmZml4UGxhY2VtZW50LFxuICAgIGJhc2VFbGVtZW50OiBIVE1MRWxlbWVudFxuICApOiB7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfSB7XG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy4jZ2V0QXV0b0ZpdENvbnRleHRQYXJlbnQoKTtcbiAgICBjb25zdCBwYXJlbnRPZmZzZXQgPSBnZXRFbGVtZW50T2Zmc2V0KFxuICAgICAgcGFyZW50LFxuICAgICAgdGhpcy4jY29uZmlnLmF1dG9GaXRPdmVyZmxvd09mZnNldFxuICAgICk7XG5cbiAgICBjb25zdCBhZmZpeGVkUmVjdCA9IHRoaXMuI2dldFJlY3QodGhpcy4jYWZmaXhlZEVsZW1lbnQpO1xuICAgIGNvbnN0IGJhc2VSZWN0ID0gdGhpcy4jZ2V0UmVjdChiYXNlRWxlbWVudCk7XG5cbiAgICAvLyBBIHBpeGVsIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbGVld2F5IGJldHdlZW4gdGhlIGVkZ2Ugb2YgdGhlIG92ZXJmbG93IHBhcmVudCBhbmQgdGhlIGVkZ2VcbiAgICAvLyBvZiB0aGUgYmFzZSBlbGVtZW50IGJlZm9yZSBpdCBkaXNhcHBlYXJzIGZyb20gdmlldy5cbiAgICAvLyBJZiB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBiYXNlIGVsZW1lbnQgaXMgbGVzcyB0aGFuIHRoaXMgcGl4ZWwgdmFsdWUsIHRoZSBhdXRvLWZpdFxuICAgIC8vIGZ1bmN0aW9uYWxpdHkgYXR0ZW1wdHMgdG8gZmluZCBhbm90aGVyIHBsYWNlbWVudC5cbiAgICBjb25zdCBkZWZhdWx0UGl4ZWxUb2xlcmFuY2UgPSA0MDtcbiAgICBsZXQgcGl4ZWxUb2xlcmFuY2U6IG51bWJlcjtcblxuICAgIGNvbnN0IG9yaWdpbmFsT2Zmc2V0VG9wID0gb2Zmc2V0LnRvcDtcbiAgICBjb25zdCBvcmlnaW5hbE9mZnNldExlZnQgPSBvZmZzZXQubGVmdDtcblxuICAgIHN3aXRjaCAocGxhY2VtZW50KSB7XG4gICAgICBjYXNlICdhYm92ZSc6XG4gICAgICBjYXNlICdiZWxvdyc6XG4gICAgICAgIC8vIEtlZXAgdGhlIGFmZml4ZWQgZWxlbWVudCB3aXRoaW4gdGhlIG92ZXJmbG93IHBhcmVudC5cbiAgICAgICAgaWYgKG9mZnNldC5sZWZ0IDwgcGFyZW50T2Zmc2V0LmxlZnQpIHtcbiAgICAgICAgICBvZmZzZXQubGVmdCA9IHBhcmVudE9mZnNldC5sZWZ0O1xuICAgICAgICB9IGVsc2UgaWYgKG9mZnNldC5sZWZ0ICsgYWZmaXhlZFJlY3Qud2lkdGggPiBwYXJlbnRPZmZzZXQucmlnaHQpIHtcbiAgICAgICAgICBvZmZzZXQubGVmdCA9IHBhcmVudE9mZnNldC5yaWdodCAtIGFmZml4ZWRSZWN0LndpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIGEgc21hbGxlciBwaXhlbCB0b2xlcmFuY2UgaWYgdGhlIGJhc2UgZWxlbWVudCB3aWR0aCBpcyBsZXNzIHRoYW4gdGhlIGRlZmF1bHQuXG4gICAgICAgIHBpeGVsVG9sZXJhbmNlID0gTWF0aC5taW4oZGVmYXVsdFBpeGVsVG9sZXJhbmNlLCBiYXNlUmVjdC53aWR0aCk7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBhZmZpeGVkIGVsZW1lbnQgbmV2ZXIgZGV0YWNoZXMgZnJvbSB0aGUgYmFzZSBlbGVtZW50LlxuICAgICAgICBpZiAoXG4gICAgICAgICAgb2Zmc2V0LmxlZnQgKyBwaXhlbFRvbGVyYW5jZSA+IGJhc2VSZWN0LnJpZ2h0IHx8XG4gICAgICAgICAgb2Zmc2V0LmxlZnQgKyBhZmZpeGVkUmVjdC53aWR0aCAtIHBpeGVsVG9sZXJhbmNlIDwgYmFzZVJlY3QubGVmdFxuICAgICAgICApIHtcbiAgICAgICAgICBvZmZzZXQubGVmdCA9IG9yaWdpbmFsT2Zmc2V0TGVmdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgICAgLy8gS2VlcCB0aGUgYWZmaXhlZCBlbGVtZW50IHdpdGhpbiB0aGUgb3ZlcmZsb3cgcGFyZW50LlxuICAgICAgICBpZiAob2Zmc2V0LnRvcCA8IHBhcmVudE9mZnNldC50b3ApIHtcbiAgICAgICAgICBvZmZzZXQudG9wID0gcGFyZW50T2Zmc2V0LnRvcDtcbiAgICAgICAgfSBlbHNlIGlmIChvZmZzZXQudG9wICsgYWZmaXhlZFJlY3QuaGVpZ2h0ID4gcGFyZW50T2Zmc2V0LmJvdHRvbSkge1xuICAgICAgICAgIG9mZnNldC50b3AgPSBwYXJlbnRPZmZzZXQuYm90dG9tIC0gYWZmaXhlZFJlY3QuaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXNlIGEgc21hbGxlciBwaXhlbCB0b2xlcmFuY2UgaWYgdGhlIGJhc2UgZWxlbWVudCBoZWlnaHQgaXMgbGVzcyB0aGFuIHRoZSBkZWZhdWx0LlxuICAgICAgICBwaXhlbFRvbGVyYW5jZSA9IE1hdGgubWluKGRlZmF1bHRQaXhlbFRvbGVyYW5jZSwgYmFzZVJlY3QuaGVpZ2h0KTtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGFmZml4ZWQgZWxlbWVudCBuZXZlciBkZXRhY2hlcyBmcm9tIHRoZSBiYXNlIGVsZW1lbnQuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBvZmZzZXQudG9wICsgcGl4ZWxUb2xlcmFuY2UgPiBiYXNlUmVjdC5ib3R0b20gfHxcbiAgICAgICAgICBvZmZzZXQudG9wICsgYWZmaXhlZFJlY3QuaGVpZ2h0IC0gcGl4ZWxUb2xlcmFuY2UgPCBiYXNlUmVjdC50b3BcbiAgICAgICAgKSB7XG4gICAgICAgICAgb2Zmc2V0LnRvcCA9IG9yaWdpbmFsT2Zmc2V0VG9wO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxuXG4gICNnZXRJbW1lZGlhdGVPdmVyZmxvd1BhcmVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuI292ZXJmbG93UGFyZW50c1t0aGlzLiNvdmVyZmxvd1BhcmVudHMubGVuZ3RoIC0gMV07XG4gIH1cblxuICAjZ2V0QXV0b0ZpdENvbnRleHRQYXJlbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGJvZHlFbGVtZW50ID0gdGhpcy4jb3ZlcmZsb3dQYXJlbnRzWzBdO1xuXG4gICAgcmV0dXJuIHRoaXMuI2NvbmZpZy5hdXRvRml0Q29udGV4dCA9PT0gU2t5QWZmaXhBdXRvRml0Q29udGV4dC5PdmVyZmxvd1BhcmVudFxuICAgICAgPyB0aGlzLiNnZXRJbW1lZGlhdGVPdmVyZmxvd1BhcmVudCgpXG4gICAgICA6IGJvZHlFbGVtZW50O1xuICB9XG5cbiAgI25vdGlmeVBsYWNlbWVudENoYW5nZShwbGFjZW1lbnQ6IFNreUFmZml4UGxhY2VtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNjdXJyZW50UGxhY2VtZW50ICE9PSBwbGFjZW1lbnQpIHtcbiAgICAgIHRoaXMuI2N1cnJlbnRQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPz8gdW5kZWZpbmVkO1xuICAgICAgdGhpcy4jcGxhY2VtZW50Q2hhbmdlLm5leHQoe1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAjcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy4jcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzKCk7XG4gICAgdGhpcy4jcmVtb3ZlUmVzaXplTGlzdGVuZXIoKTtcblxuICAgIHRoaXMuI292ZXJmbG93UGFyZW50cyA9IFtdO1xuXG4gICAgdGhpcy4jY29uZmlnID1cbiAgICAgIHRoaXMuI2Jhc2VFbGVtZW50ID1cbiAgICAgIHRoaXMuI2N1cnJlbnRQbGFjZW1lbnQgPVxuICAgICAgdGhpcy4jY3VycmVudE9mZnNldCA9XG4gICAgICAgIHVuZGVmaW5lZDtcbiAgfVxuXG4gICNpc05ld09mZnNldChvZmZzZXQ6IFNreUFmZml4T2Zmc2V0KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuI2N1cnJlbnRPZmZzZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy4jY3VycmVudE9mZnNldCA9IG9mZnNldDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuI2N1cnJlbnRPZmZzZXQudG9wID09PSBvZmZzZXQudG9wICYmXG4gICAgICB0aGlzLiNjdXJyZW50T2Zmc2V0LmxlZnQgPT09IG9mZnNldC5sZWZ0XG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy4jY3VycmVudE9mZnNldCA9IG9mZnNldDtcblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgI2lzQmFzZUVsZW1lbnRWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy4jYmFzZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlUmVjdCA9IHRoaXMuI2Jhc2VFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgcmV0dXJuIGlzT2Zmc2V0UGFydGlhbGx5VmlzaWJsZVdpdGhpblBhcmVudChcbiAgICAgIHRoaXMuI2dldEltbWVkaWF0ZU92ZXJmbG93UGFyZW50KCksXG4gICAgICB7XG4gICAgICAgIHRvcDogYmFzZVJlY3QudG9wLFxuICAgICAgICBsZWZ0OiBiYXNlUmVjdC5sZWZ0LFxuICAgICAgICByaWdodDogYmFzZVJlY3QucmlnaHQsXG4gICAgICAgIGJvdHRvbTogYmFzZVJlY3QuYm90dG9tLFxuICAgICAgfSxcbiAgICAgIHRoaXMuI2NvbmZpZy5hdXRvRml0T3ZlcmZsb3dPZmZzZXRcbiAgICApO1xuICB9XG5cbiAgI2FkZFNjcm9sbExpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLiNzY3JvbGxMaXN0ZW5lcnMgPSB0aGlzLiNvdmVyZmxvd1BhcmVudHMubWFwKChwYXJlbnRFbGVtZW50KSA9PiB7XG4gICAgICBjb25zdCBvdmVyZmxvdyA9XG4gICAgICAgIHBhcmVudEVsZW1lbnQgPT09IGRvY3VtZW50LmJvZHkgPyAnd2luZG93JyA6IHBhcmVudEVsZW1lbnQ7XG4gICAgICByZXR1cm4gdGhpcy4jcmVuZGVyZXIubGlzdGVuKG92ZXJmbG93LCAnc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgICB0aGlzLiNhZmZpeCgpO1xuICAgICAgICB0aGlzLiNvdmVyZmxvd1Njcm9sbC5uZXh0KCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gICNhZGRSZXNpemVMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICB0aGlzLiNyZXNpemVMaXN0ZW5lciA9IGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5zdWJzY3JpYmUoKCkgPT5cbiAgICAgIHRoaXMuI2FmZml4KClcbiAgICApO1xuICB9XG5cbiAgI3JlbW92ZVJlc2l6ZUxpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNyZXNpemVMaXN0ZW5lcikge1xuICAgICAgdGhpcy4jcmVzaXplTGlzdGVuZXIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuI3Jlc2l6ZUxpc3RlbmVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gICNyZW1vdmVTY3JvbGxMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI3Njcm9sbExpc3RlbmVycykge1xuICAgICAgLy8gUmVtb3ZlIHJlbmRlcmVyLWdlbmVyYXRlZCBsaXN0ZW5lcnMgYnkgY2FsbGluZyB0aGUgbGlzdGVuZXIgaXRzZWxmLlxuICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvOTM2OCNpc3N1ZWNvbW1lbnQtMjI3MTk5Nzc4XG4gICAgICB0aGlzLiNzY3JvbGxMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCkpO1xuICAgICAgdGhpcy4jc2Nyb2xsTGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -0,0 +1,26 @@
1
+ import { ReplaySubject } from 'rxjs';
2
+ /**
3
+ * @internal
4
+ * An API to provide default Angular component input values to child components.
5
+ */
6
+ export class SkyDefaultInputProvider {
7
+ #props = {};
8
+ setValue(componentName, inputName, value) {
9
+ const subject = this.#getSubject(componentName, inputName);
10
+ subject.next(value);
11
+ }
12
+ getValue(componentName, inputName) {
13
+ const test = this.#getSubject(componentName, inputName);
14
+ return test.asObservable();
15
+ }
16
+ #getSubject(componentName, inputName) {
17
+ const componentSubjects = this.#props[componentName] || {};
18
+ const inputSubject = componentSubjects[inputName];
19
+ if (!inputSubject) {
20
+ componentSubjects[inputName] = new ReplaySubject(1);
21
+ this.#props[componentName] = componentSubjects;
22
+ }
23
+ return componentSubjects[inputName];
24
+ }
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1pbnB1dC1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9jb3JlL3NyYy9saWIvbW9kdWxlcy9kZWZhdWx0LWlucHV0LXByb3ZpZGVyL2RlZmF1bHQtaW5wdXQtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFjLGFBQWEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVqRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sdUJBQXVCO0lBQ2xDLE1BQU0sR0FBMkQsRUFBRSxDQUFDO0lBRTdELFFBQVEsQ0FBSSxhQUFxQixFQUFFLFNBQWlCLEVBQUUsS0FBUTtRQUNuRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRCxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFTSxRQUFRLENBQ2IsYUFBcUIsRUFDckIsU0FBaUI7UUFFakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDeEQsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFtQixDQUFDO0lBQzlDLENBQUM7SUFFRCxXQUFXLENBQ1QsYUFBcUIsRUFDckIsU0FBaUI7UUFFakIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMzRCxNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVsRCxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ2pCLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsaUJBQWlCLENBQUM7U0FDaEQ7UUFFRCxPQUFPLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEFuIEFQSSB0byBwcm92aWRlIGRlZmF1bHQgQW5ndWxhciBjb21wb25lbnQgaW5wdXQgdmFsdWVzIHRvIGNoaWxkIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTa3lEZWZhdWx0SW5wdXRQcm92aWRlciB7XG4gICNwcm9wczogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgUmVwbGF5U3ViamVjdDx1bmtub3duPj4+ID0ge307XG5cbiAgcHVibGljIHNldFZhbHVlPFQ+KGNvbXBvbmVudE5hbWU6IHN0cmluZywgaW5wdXROYW1lOiBzdHJpbmcsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgY29uc3Qgc3ViamVjdCA9IHRoaXMuI2dldFN1YmplY3QoY29tcG9uZW50TmFtZSwgaW5wdXROYW1lKTtcbiAgICBzdWJqZWN0Lm5leHQodmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldFZhbHVlPFQ+KFxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZyxcbiAgICBpbnB1dE5hbWU6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPFQ+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0ZXN0ID0gdGhpcy4jZ2V0U3ViamVjdChjb21wb25lbnROYW1lLCBpbnB1dE5hbWUpO1xuICAgIHJldHVybiB0ZXN0LmFzT2JzZXJ2YWJsZSgpIGFzIE9ic2VydmFibGU8VD47XG4gIH1cblxuICAjZ2V0U3ViamVjdChcbiAgICBjb21wb25lbnROYW1lOiBzdHJpbmcsXG4gICAgaW5wdXROYW1lOiBzdHJpbmdcbiAgKTogUmVwbGF5U3ViamVjdDx1bmtub3duPiB7XG4gICAgY29uc3QgY29tcG9uZW50U3ViamVjdHMgPSB0aGlzLiNwcm9wc1tjb21wb25lbnROYW1lXSB8fCB7fTtcbiAgICBjb25zdCBpbnB1dFN1YmplY3QgPSBjb21wb25lbnRTdWJqZWN0c1tpbnB1dE5hbWVdO1xuXG4gICAgaWYgKCFpbnB1dFN1YmplY3QpIHtcbiAgICAgIGNvbXBvbmVudFN1YmplY3RzW2lucHV0TmFtZV0gPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcbiAgICAgIHRoaXMuI3Byb3BzW2NvbXBvbmVudE5hbWVdID0gY29tcG9uZW50U3ViamVjdHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudFN1YmplY3RzW2lucHV0TmFtZV07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,81 @@
1
+ import { Injectable, } from '@angular/core';
2
+ import { Subject, fromEvent as observableFromEvent } from 'rxjs';
3
+ import { debounceTime, takeUntil } from 'rxjs/operators';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../mutation/mutation-observer-service";
6
+ /**
7
+ * @internal
8
+ */
9
+ export class SkyDockDomAdapterService {
10
+ #currentDockHeight;
11
+ #mutationSvc;
12
+ #ngUnsubscribe = new Subject();
13
+ #observer;
14
+ #renderer;
15
+ #styleElement;
16
+ constructor(mutationSvc, rendererFactory) {
17
+ this.#mutationSvc = mutationSvc;
18
+ this.#renderer = rendererFactory.createRenderer(undefined, null);
19
+ }
20
+ ngOnDestroy() {
21
+ if (this.#observer) {
22
+ this.#observer.disconnect();
23
+ }
24
+ this.#ngUnsubscribe.next();
25
+ this.#ngUnsubscribe.complete();
26
+ if (this.#styleElement) {
27
+ this.#destroyStyleElement();
28
+ }
29
+ this.#currentDockHeight = this.#observer = this.#styleElement = undefined;
30
+ }
31
+ setSticky(elementRef) {
32
+ this.#renderer.addClass(elementRef.nativeElement, 'sky-dock-sticky');
33
+ }
34
+ setZIndex(zIndex, elementRef) {
35
+ this.#renderer.setStyle(elementRef.nativeElement, 'z-index', zIndex);
36
+ }
37
+ unbindDock(elementRef) {
38
+ this.#renderer.addClass(elementRef.nativeElement, 'sky-dock-unbound');
39
+ }
40
+ watchDomChanges(elementRef) {
41
+ this.#observer = this.#mutationSvc.create(() => {
42
+ this.#adjustBodyStyles(elementRef);
43
+ });
44
+ this.#observer.observe(elementRef.nativeElement, {
45
+ attributes: true,
46
+ childList: true,
47
+ characterData: true,
48
+ subtree: true,
49
+ });
50
+ observableFromEvent(window, 'resize')
51
+ .pipe(debounceTime(250), takeUntil(this.#ngUnsubscribe))
52
+ .subscribe(() => this.#adjustBodyStyles(elementRef));
53
+ }
54
+ #adjustBodyStyles(elementRef) {
55
+ const dockHeight = elementRef.nativeElement.getBoundingClientRect().height;
56
+ if (dockHeight === this.#currentDockHeight) {
57
+ return;
58
+ }
59
+ // Create a style element to avoid overwriting any existing inline body styles.
60
+ const styleElement = this.#renderer.createElement('style');
61
+ const textNode = this.#renderer.createText(`body { margin-bottom: ${dockHeight}px; }`);
62
+ // Apply a `data-` attribute to make unit testing easier.
63
+ this.#renderer.setAttribute(styleElement, 'data-test-selector', 'sky-layout-dock-bottom-styles');
64
+ this.#renderer.appendChild(styleElement, textNode);
65
+ this.#renderer.appendChild(document.head, styleElement);
66
+ if (this.#styleElement) {
67
+ this.#destroyStyleElement();
68
+ }
69
+ this.#currentDockHeight = dockHeight;
70
+ this.#styleElement = styleElement;
71
+ }
72
+ #destroyStyleElement() {
73
+ this.#renderer.removeChild(document.head, this.#styleElement);
74
+ }
75
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyDockDomAdapterService, deps: [{ token: i1.SkyMutationObserverService }, { token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable }); }
76
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyDockDomAdapterService }); }
77
+ }
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyDockDomAdapterService, decorators: [{
79
+ type: Injectable
80
+ }], ctorParameters: function () { return [{ type: i1.SkyMutationObserverService }, { type: i0.RendererFactory2 }]; } });
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay1kb20tYWRhcHRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2NvcmUvc3JjL2xpYi9tb2R1bGVzL2RvY2svZG9jay1kb20tYWRhcHRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxVQUFVLEdBSVgsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLElBQUksbUJBQW1CLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBSXpEOztHQUVHO0FBRUgsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxrQkFBa0IsQ0FBcUI7SUFFdkMsWUFBWSxDQUE2QjtJQUV6QyxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztJQUVyQyxTQUFTLENBQStCO0lBRXhDLFNBQVMsQ0FBWTtJQUVyQixhQUFhLENBQStCO0lBRTVDLFlBQ0UsV0FBdUMsRUFDdkMsZUFBaUM7UUFFakMsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUM3QjtRQUNELElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUUvQixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDdEIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7UUFF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UmVmLFxuICBJbmplY3RhYmxlLFxuICBPbkRlc3Ryb3ksXG4gIFJlbmRlcmVyMixcbiAgUmVuZGVyZXJGYWN0b3J5Mixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFN1YmplY3QsIGZyb21FdmVudCBhcyBvYnNlcnZhYmxlRnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgU2t5TXV0YXRpb25PYnNlcnZlclNlcnZpY2UgfSBmcm9tICcuLi9tdXRhdGlvbi9tdXRhdGlvbi1vYnNlcnZlci1zZXJ2aWNlJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNreURvY2tEb21BZGFwdGVyU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gICNjdXJyZW50RG9ja0hlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gICNtdXRhdGlvblN2YzogU2t5TXV0YXRpb25PYnNlcnZlclNlcnZpY2U7XG5cbiAgI25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICNvYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlciB8IHVuZGVmaW5lZDtcblxuICAjcmVuZGVyZXI6IFJlbmRlcmVyMjtcblxuICAjc3R5bGVFbGVtZW50OiBIVE1MU3R5bGVFbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG11dGF0aW9uU3ZjOiBTa3lNdXRhdGlvbk9ic2VydmVyU2VydmljZSxcbiAgICByZW5kZXJlckZhY3Rvcnk6IFJlbmRlcmVyRmFjdG9yeTJcbiAgKSB7XG4gICAgdGhpcy4jbXV0YXRpb25TdmMgPSBtdXRhdGlvblN2YztcbiAgICB0aGlzLiNyZW5kZXJlciA9IHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcih1bmRlZmluZWQsIG51bGwpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNvYnNlcnZlcikge1xuICAgICAgdGhpcy4jb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG5cbiAgICBpZiAodGhpcy4jc3R5bGVFbGVtZW50KSB7XG4gICAgICB0aGlzLiNkZXN0cm95U3R5bGVFbGVtZW50KCk7XG4gICAgfVxuXG4gICAgdGhpcy4jY3VycmVudERvY2tIZWlnaHQgPSB0aGlzLiNvYnNlcnZlciA9IHRoaXMuI3N0eWxlRWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXRTdGlja3koZWxlbWVudFJlZjogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIHRoaXMuI3JlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NreS1kb2NrLXN0aWNreScpO1xuICB9XG5cbiAgcHVibGljIHNldFpJbmRleCh6SW5kZXg6IG51bWJlciwgZWxlbWVudFJlZjogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIHRoaXMuI3JlbmRlcmVyLnNldFN0eWxlKGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3otaW5kZXgnLCB6SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIHVuYmluZERvY2soZWxlbWVudFJlZjogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIHRoaXMuI3JlbmRlcmVyLmFkZENsYXNzKGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3NreS1kb2NrLXVuYm91bmQnKTtcbiAgfVxuXG4gIHB1YmxpYyB3YXRjaERvbUNoYW5nZXMoZWxlbWVudFJlZjogRWxlbWVudFJlZik6IHZvaWQge1xuICAgIHRoaXMuI29ic2VydmVyID0gdGhpcy4jbXV0YXRpb25TdmMuY3JlYXRlKCgpID0+IHtcbiAgICAgIHRoaXMuI2FkanVzdEJvZHlTdHlsZXMoZWxlbWVudFJlZik7XG4gICAgfSk7XG5cbiAgICB0aGlzLiNvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwge1xuICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgIGNoYXJhY3RlckRhdGE6IHRydWUsXG4gICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgb2JzZXJ2YWJsZUZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDI1MCksIHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy4jYWRqdXN0Qm9keVN0eWxlcyhlbGVtZW50UmVmKSk7XG4gIH1cblxuICAjYWRqdXN0Qm9keVN0eWxlcyhlbGVtZW50UmVmOiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgY29uc3QgZG9ja0hlaWdodCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgaWYgKGRvY2tIZWlnaHQgPT09IHRoaXMuI2N1cnJlbnREb2NrSGVpZ2h0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgc3R5bGUgZWxlbWVudCB0byBhdm9pZCBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgaW5saW5lIGJvZHkgc3R5bGVzLlxuICAgIGNvbnN0IHN0eWxlRWxlbWVudCA9IHRoaXMuI3JlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgY29uc3QgdGV4dE5vZGUgPSB0aGlzLiNyZW5kZXJlci5jcmVhdGVUZXh0KFxuICAgICAgYGJvZHkgeyBtYXJnaW4tYm90dG9tOiAke2RvY2tIZWlnaHR9cHg7IH1gXG4gICAgKTtcblxuICAgIC8vIEFwcGx5IGEgYGRhdGEtYCBhdHRyaWJ1dGUgdG8gbWFrZSB1bml0IHRlc3RpbmcgZWFzaWVyLlxuICAgIHRoaXMuI3JlbmRlcmVyLnNldEF0dHJpYnV0ZShcbiAgICAgIHN0eWxlRWxlbWVudCxcbiAgICAgICdkYXRhLXRlc3Qtc2VsZWN0b3InLFxuICAgICAgJ3NreS1sYXlvdXQtZG9jay1ib3R0b20tc3R5bGVzJ1xuICAgICk7XG5cbiAgICB0aGlzLiNyZW5kZXJlci5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQsIHRleHROb2RlKTtcbiAgICB0aGlzLiNyZW5kZXJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5oZWFkLCBzdHlsZUVsZW1lbnQpO1xuXG4gICAgaWYgKHRoaXMuI3N0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy4jZGVzdHJveVN0eWxlRWxlbWVudCgpO1xuICAgIH1cblxuICAgIHRoaXMuI2N1cnJlbnREb2NrSGVpZ2h0ID0gZG9ja0hlaWdodDtcbiAgICB0aGlzLiNzdHlsZUVsZW1lbnQgPSBzdHlsZUVsZW1lbnQ7XG4gIH1cblxuICAjZGVzdHJveVN0eWxlRWxlbWVudCgpOiB2b2lkIHtcbiAgICB0aGlzLiNyZW5kZXJlci5yZW1vdmVDaGlsZChkb2N1bWVudC5oZWFkLCB0aGlzLiNzdHlsZUVsZW1lbnQpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,31 @@
1
+ import { Subject } from 'rxjs';
2
+ /**
3
+ * Represents a single item added to the dock.
4
+ */
5
+ export class SkyDockItem {
6
+ /**
7
+ * An event that emits when the item is removed from the dock.
8
+ */
9
+ get destroyed() {
10
+ return this.#destroyedObs;
11
+ }
12
+ #destroyed = new Subject();
13
+ #destroyedObs;
14
+ /**
15
+ * @param componentInstance The item's component instance.
16
+ * @param stackOrder The assigned stack order of the docked item.
17
+ */
18
+ constructor(componentInstance, stackOrder) {
19
+ this.componentInstance = componentInstance;
20
+ this.stackOrder = stackOrder;
21
+ this.#destroyedObs = this.#destroyed.asObservable();
22
+ }
23
+ /**
24
+ * Removes the item from the dock.
25
+ */
26
+ destroy() {
27
+ this.#destroyed.next();
28
+ this.#destroyed.complete();
29
+ }
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jay1pdGVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2NvcmUvc3JjL2xpYi9tb2R1bGVzL2RvY2svZG9jay1pdGVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFM0M7O0dBRUc7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUN0Qjs7T0FFRztJQUNILElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELFVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRWpDLGFBQWEsQ0FBbUI7SUFFaEM7OztPQUdHO0lBQ0gsWUFDa0IsaUJBQW9CLEVBQ3BCLFVBQWtCO1FBRGxCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBRztRQUNwQixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBRWxDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzdCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgc2luZ2xlIGl0ZW0gYWRkZWQgdG8gdGhlIGRvY2suXG4gKi9cbmV4cG9ydCBjbGFzcyBTa3lEb2NrSXRlbTxUPiB7XG4gIC8qKlxuICAgKiBBbiBldmVudCB0aGF0IGVtaXRzIHdoZW4gdGhlIGl0ZW0gaXMgcmVtb3ZlZCBmcm9tIHRoZSBkb2NrLlxuICAgKi9cbiAgcHVibGljIGdldCBkZXN0cm95ZWQoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuI2Rlc3Ryb3llZE9icztcbiAgfVxuXG4gICNkZXN0cm95ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICNkZXN0cm95ZWRPYnM6IE9ic2VydmFibGU8dm9pZD47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBjb21wb25lbnRJbnN0YW5jZSBUaGUgaXRlbSdzIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHN0YWNrT3JkZXIgVGhlIGFzc2lnbmVkIHN0YWNrIG9yZGVyIG9mIHRoZSBkb2NrZWQgaXRlbS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyByZWFkb25seSBjb21wb25lbnRJbnN0YW5jZTogVCxcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3RhY2tPcmRlcjogbnVtYmVyXG4gICkge1xuICAgIHRoaXMuI2Rlc3Ryb3llZE9icyA9IHRoaXMuI2Rlc3Ryb3llZC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBpdGVtIGZyb20gdGhlIGRvY2suXG4gICAqL1xuICBwdWJsaWMgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLiNkZXN0cm95ZWQubmV4dCgpO1xuICAgIHRoaXMuI2Rlc3Ryb3llZC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=