@scion/components 15.0.2 → 16.1.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 (110) hide show
  1. package/dimension/dimension.directive.d.ts +2 -2
  2. package/dimension/dimension.module.d.ts +1 -2
  3. package/esm2022/dimension/dimension.directive.mjs +85 -0
  4. package/esm2022/dimension/dimension.module.mjs +35 -0
  5. package/esm2022/sashbox/element-ref.directive.mjs +32 -0
  6. package/esm2022/sashbox/public_api.mjs +18 -0
  7. package/esm2022/sashbox/sash-initializer.directive.mjs +36 -0
  8. package/esm2022/sashbox/sash.directive.mjs +146 -0
  9. package/esm2022/sashbox/sashbox.component.mjs +286 -0
  10. package/esm2022/sashbox/sashbox.module.mjs +56 -0
  11. package/esm2022/splitter/public_api.mjs +17 -0
  12. package/esm2022/splitter/splitter.component.mjs +226 -0
  13. package/esm2022/splitter/splitter.module.mjs +39 -0
  14. package/esm2022/throbber/ellipsis-throbber/ellipsis-throbber.component.mjs +26 -0
  15. package/esm2022/throbber/ripple-throbber/ripple-throbber.component.mjs +26 -0
  16. package/esm2022/throbber/roller-throbber/roller-throbber.component.mjs +26 -0
  17. package/esm2022/throbber/spinner-throbber/spinner-throbber.component.mjs +27 -0
  18. package/esm2022/throbber/throbber.component.mjs +76 -0
  19. package/esm2022/throbber/throbber.module.mjs +33 -0
  20. package/esm2022/viewport/native-scrollbar-track-size-provider.service.mjs +113 -0
  21. package/esm2022/viewport/public_api.mjs +19 -0
  22. package/esm2022/viewport/scrollable.directive.mjs +95 -0
  23. package/esm2022/viewport/scrollbar/scrollbar.component.mjs +323 -0
  24. package/esm2022/viewport/viewport.component.mjs +289 -0
  25. package/esm2022/viewport/viewport.module.mjs +43 -0
  26. package/{fesm2015 → fesm2022}/scion-components-dimension.mjs +13 -11
  27. package/fesm2022/scion-components-dimension.mjs.map +1 -0
  28. package/{fesm2020 → fesm2022}/scion-components-sashbox.mjs +69 -61
  29. package/fesm2022/scion-components-sashbox.mjs.map +1 -0
  30. package/{fesm2020 → fesm2022}/scion-components-splitter.mjs +25 -25
  31. package/fesm2022/scion-components-splitter.mjs.map +1 -0
  32. package/fesm2022/scion-components-throbber.mjs +215 -0
  33. package/fesm2022/scion-components-throbber.mjs.map +1 -0
  34. package/{fesm2020 → fesm2022}/scion-components-viewport.mjs +164 -161
  35. package/fesm2022/scion-components-viewport.mjs.map +1 -0
  36. package/package.json +27 -43
  37. package/sashbox/element-ref.directive.d.ts +1 -1
  38. package/sashbox/public_api.d.ts +3 -3
  39. package/sashbox/sash-initializer.directive.d.ts +1 -1
  40. package/sashbox/sash.directive.d.ts +2 -2
  41. package/sashbox/sashbox.component.d.ts +1 -3
  42. package/sashbox/sashbox.module.d.ts +1 -5
  43. package/splitter/public_api.d.ts +2 -2
  44. package/splitter/splitter.component.d.ts +1 -3
  45. package/splitter/splitter.module.d.ts +1 -2
  46. package/throbber/ellipsis-throbber/ellipsis-throbber.component.d.ts +1 -1
  47. package/throbber/ripple-throbber/ripple-throbber.component.d.ts +1 -1
  48. package/throbber/roller-throbber/roller-throbber.component.d.ts +1 -1
  49. package/throbber/spinner-throbber/spinner-throbber.component.d.ts +1 -1
  50. package/throbber/throbber.component.d.ts +1 -1
  51. package/throbber/throbber.module.d.ts +1 -6
  52. package/viewport/native-scrollbar-track-size-provider.service.d.ts +0 -2
  53. package/viewport/public_api.d.ts +3 -4
  54. package/viewport/scrollable.directive.d.ts +1 -1
  55. package/viewport/scrollbar/scrollbar.component.d.ts +2 -2
  56. package/viewport/viewport.component.d.ts +2 -2
  57. package/viewport/viewport.module.d.ts +1 -3
  58. package/esm2020/dimension/dimension.directive.mjs +0 -83
  59. package/esm2020/dimension/dimension.module.mjs +0 -38
  60. package/esm2020/sashbox/element-ref.directive.mjs +0 -27
  61. package/esm2020/sashbox/public_api.mjs +0 -18
  62. package/esm2020/sashbox/sash-initializer.directive.mjs +0 -32
  63. package/esm2020/sashbox/sash.directive.mjs +0 -144
  64. package/esm2020/sashbox/sashbox.component.mjs +0 -278
  65. package/esm2020/sashbox/sashbox.module.mjs +0 -69
  66. package/esm2020/splitter/public_api.mjs +0 -17
  67. package/esm2020/splitter/splitter.component.mjs +0 -227
  68. package/esm2020/splitter/splitter.module.mjs +0 -42
  69. package/esm2020/throbber/ellipsis-throbber/ellipsis-throbber.component.mjs +0 -25
  70. package/esm2020/throbber/ripple-throbber/ripple-throbber.component.mjs +0 -25
  71. package/esm2020/throbber/roller-throbber/roller-throbber.component.mjs +0 -25
  72. package/esm2020/throbber/spinner-throbber/spinner-throbber.component.mjs +0 -26
  73. package/esm2020/throbber/throbber.component.mjs +0 -67
  74. package/esm2020/throbber/throbber.module.mjs +0 -48
  75. package/esm2020/viewport/native-scrollbar-track-size-provider.service.mjs +0 -114
  76. package/esm2020/viewport/public_api.mjs +0 -20
  77. package/esm2020/viewport/scrollable.directive.mjs +0 -93
  78. package/esm2020/viewport/scrollbar/scrollbar.component.mjs +0 -322
  79. package/esm2020/viewport/viewport.component.mjs +0 -281
  80. package/esm2020/viewport/viewport.module.mjs +0 -50
  81. package/fesm2015/scion-components-dimension.mjs.map +0 -1
  82. package/fesm2015/scion-components-sashbox.mjs +0 -554
  83. package/fesm2015/scion-components-sashbox.mjs.map +0 -1
  84. package/fesm2015/scion-components-splitter.mjs +0 -284
  85. package/fesm2015/scion-components-splitter.mjs.map +0 -1
  86. package/fesm2015/scion-components-throbber.mjs +0 -214
  87. package/fesm2015/scion-components-throbber.mjs.map +0 -1
  88. package/fesm2015/scion-components-viewport.mjs +0 -861
  89. package/fesm2015/scion-components-viewport.mjs.map +0 -1
  90. package/fesm2015/scion-components.mjs +0 -4
  91. package/fesm2015/scion-components.mjs.map +0 -1
  92. package/fesm2020/scion-components-dimension.mjs +0 -135
  93. package/fesm2020/scion-components-dimension.mjs.map +0 -1
  94. package/fesm2020/scion-components-sashbox.mjs.map +0 -1
  95. package/fesm2020/scion-components-splitter.mjs.map +0 -1
  96. package/fesm2020/scion-components-throbber.mjs +0 -214
  97. package/fesm2020/scion-components-throbber.mjs.map +0 -1
  98. package/fesm2020/scion-components-viewport.mjs.map +0 -1
  99. /package/{esm2020 → esm2022}/dimension/public_api.mjs +0 -0
  100. /package/{esm2020 → esm2022}/dimension/scion-components-dimension.mjs +0 -0
  101. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  102. /package/{esm2020 → esm2022}/sashbox/sashbox-accessor.mjs +0 -0
  103. /package/{esm2020 → esm2022}/sashbox/scion-components-sashbox.mjs +0 -0
  104. /package/{esm2020 → esm2022}/scion-components.mjs +0 -0
  105. /package/{esm2020 → esm2022}/splitter/scion-components-splitter.mjs +0 -0
  106. /package/{esm2020 → esm2022}/throbber/public_api.mjs +0 -0
  107. /package/{esm2020 → esm2022}/throbber/scion-components-throbber.mjs +0 -0
  108. /package/{esm2020 → esm2022}/viewport/scion-components-viewport.mjs +0 -0
  109. /package/{fesm2020 → fesm2022}/scion-components.mjs +0 -0
  110. /package/{fesm2020 → fesm2022}/scion-components.mjs.map +0 -0
@@ -0,0 +1,289 @@
1
+ /*
2
+ * Copyright (c) 2018-2019 Swiss Federal Railways
3
+ *
4
+ * This program and the accompanying materials are made
5
+ * available under the terms of the Eclipse Public License 2.0
6
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
7
+ *
8
+ * SPDX-License-Identifier: EPL-2.0
9
+ */
10
+ import { Component, EventEmitter, HostListener, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
11
+ import { coerceElement } from '@angular/cdk/coercion';
12
+ import { SciScrollableDirective } from './scrollable.directive';
13
+ import { SciScrollbarComponent } from './scrollbar/scrollbar.component';
14
+ import { ScrollingModule } from '@angular/cdk/scrolling';
15
+ import { AsyncPipe, NgIf } from '@angular/common';
16
+ import * as i0 from "@angular/core";
17
+ import * as i1 from "./native-scrollbar-track-size-provider.service";
18
+ import * as i2 from "@angular/cdk/scrolling";
19
+ /**
20
+ * Represents a viewport with slotted content (`<ng-content>`) used as scrollable content. By default, content is added to a CSS grid layout.
21
+ *
22
+ * The viewport component displays scrollbars when its content overflows. Scrollbars are displayed on top of the content, not next to it.
23
+ * The component uses the native scrollbars of the operating system if they are already sitting on top, or falls back and renders scrollbars on top otherwise.
24
+ * The viewport remains natively scrollable with the native scrollbars shifted out of the viewport's visible area. Consequently, the viewport keeps supporting
25
+ * native scrolling features such as touch gestures, scroll speed acceleration, or scrolling near the viewport edges during drag-and-drop operations.
26
+ *
27
+ * ```html
28
+ * <sci-viewport>
29
+ * your content
30
+ * </sci-viewport>
31
+ * ```
32
+ *
33
+ * ## Adding the viewport to a layout
34
+ *
35
+ * Typically you would add the viewport component to a flexible layout, filling the remaining space vertically and horizontally, such as a flexbox container
36
+ * with the viewport's `flex` CSS property set to either `flex: auto` or `flex: 1 1 0`.
37
+ *
38
+ * The viewport is sized according to its content width and height. It grows to absorb any free space, thus overflowing its content only when encountering
39
+ * a layout constraint. Depending on the layout, different steps may be necessary to prevent the viewport from growing to infinity.
40
+ *
41
+ * - If practical, give the viewport a fixed size or a maximum size.
42
+ * - If you add the viewport to a flexbox layout, make sure that it cannot exceed the available space. Instead, the viewport should fill the remaining space,
43
+ * vertically and horizontally. Be aware that, by default, a flex item does not shrink below its minimum content size. To change this, set the viewport's
44
+ * `flex-basis` to `0` (instead of `auto`), or use the CSS shorthand property `flex: 1 1 0`. The `flex-basis` defines the default size of a flex item before
45
+ * the remaining extra space is distributed. If the viewport does not appear after setting this property, check its parent elements' content sizes.
46
+ * As an alternative to setting `flex: 1 1 0`, change the setting to `flex: auto` and hide the overflow in the parent element, as follows: `overflow: hidden`.
47
+ * Another approach would be to set the minimum height of all parents to `0`, as follows: `min-height: 0`.
48
+ *
49
+ * For the complete documentation on the flex layout and its features, refer to https://developer.mozilla.org/en-US/docs/Web/CSS/flex.
50
+ *
51
+ *
52
+ * ## Layouting the viewport's slotted content
53
+ *
54
+ * By default, the viewport's content is added to a CSS grid container with a single column, filling remaining space vertically and horizontally.
55
+ * Using the `::part(content)` pseudo element selector, you can configure the grid container or apply a different layout, such as a flex or flow layout.
56
+ *
57
+ * #### Example of adding slotted content to a CSS flex container.
58
+ * ```css
59
+ * sci-viewport::part(content) {
60
+ * display: flex;
61
+ * flex-direction: column;
62
+ * }
63
+ * ```
64
+ *
65
+ * #### Example of configuring CSS grid container with two columns
66
+ * ```css
67
+ * sci-viewport::part(content) {
68
+ * grid-template-columns: 1fr 1fr;
69
+ * gap: 1em;
70
+ * }
71
+ * ```
72
+ *
73
+ * ## Styling of scrollbars
74
+ *
75
+ * You can override the following CSS variables to control the appearance of the scrollbar:
76
+ *
77
+ * - sci-viewport-scrollbar-color: Sets the color of the scrollbar (by default, uses `rgb(78, 78, 78)`).
78
+ *
79
+ * ```css
80
+ * sci-viewport {
81
+ * --sci-viewport-scrollbar-color: blue;
82
+ * }
83
+ * ```
84
+ */
85
+ class SciViewportComponent {
86
+ /** @internal */
87
+ set setViewport(viewport) {
88
+ this._viewportElement = coerceElement(viewport);
89
+ }
90
+ /** @internal */
91
+ set setViewportClient(viewportClient) {
92
+ this._viewportClient = coerceElement(viewportClient);
93
+ }
94
+ /**
95
+ * Controls whether to use native scrollbars or, which is by default, emulated scrollbars that sit on top of the viewport client.
96
+ * In the latter, the viewport client remains natively scrollable.
97
+ */
98
+ set scrollbarStyle(scrollbarStyle) {
99
+ this._scrollbarStyle = scrollbarStyle || 'on-top';
100
+ }
101
+ get scrollbarStyle() {
102
+ return this._scrollbarStyle;
103
+ }
104
+ constructor(host, nativeScrollbarTrackSizeProvider) {
105
+ this.host = host;
106
+ this.nativeScrollbarTrackSizeProvider = nativeScrollbarTrackSizeProvider;
107
+ this._scrollbarStyle = 'on-top';
108
+ /**
109
+ * Emits upon a scroll event.
110
+ *
111
+ * You can add [sciDimension] directive to the viewport or viewport client to be notified about layout changes.
112
+ */
113
+ this.scroll = new EventEmitter(); // eslint-disable-line @angular-eslint/no-output-native
114
+ }
115
+ focus() {
116
+ this._viewportElement?.focus();
117
+ }
118
+ onScroll(event) {
119
+ this.scroll.emit(event);
120
+ }
121
+ /**
122
+ * Returns the number of pixels that the viewport client is scrolled vertically.
123
+ *
124
+ * @see Element.scrollTop
125
+ */
126
+ get scrollTop() {
127
+ return this._viewportElement.scrollTop;
128
+ }
129
+ /**
130
+ * Sets the number of pixels that the viewport client is scrolled vertically.
131
+ *
132
+ * @see Element.scrollTop
133
+ */
134
+ set scrollTop(scrollTop) {
135
+ this._viewportElement.scrollTop = scrollTop;
136
+ }
137
+ /**
138
+ * Returns the number of pixels that the viewport client is scrolled horizontally.
139
+ *
140
+ * @see Element.scrollLeft
141
+ */
142
+ get scrollLeft() {
143
+ return this._viewportElement.scrollLeft;
144
+ }
145
+ /**
146
+ * Sets the number of pixels that the viewport client is scrolled horizontally.
147
+ *
148
+ * @see Element.scrollLeft
149
+ */
150
+ set scrollLeft(scrollLeft) {
151
+ this._viewportElement.scrollLeft = scrollLeft;
152
+ }
153
+ /**
154
+ * Returns the height of the viewport client.
155
+ *
156
+ * @see Element.scrollHeight
157
+ */
158
+ get scrollHeight() {
159
+ return this._viewportElement.scrollHeight;
160
+ }
161
+ /**
162
+ * Returns the width of the viewport client.
163
+ *
164
+ * @see Element.scrollWidth
165
+ */
166
+ get scrollWidth() {
167
+ return this._viewportElement.scrollWidth;
168
+ }
169
+ /**
170
+ * Returns the viewport {HTMLElement}.
171
+ */
172
+ get viewportElement() {
173
+ return this._viewportElement;
174
+ }
175
+ /**
176
+ * Returns the viewport client {HTMLElement}.
177
+ */
178
+ get viewportClientElement() {
179
+ return this._viewportClient;
180
+ }
181
+ /**
182
+ * Checks if the specified element is scrolled into the viewport.
183
+ *
184
+ * @param element - the element to be checked
185
+ * @param fit - control if the element must fully or partially fit into the viewport
186
+ * @return `true` if the element is scrolled into the viewport, or `false` otherwise.
187
+ */
188
+ isElementInView(element, fit) {
189
+ const elTop = this.computeOffset(element, 'top');
190
+ if (elTop === null) {
191
+ return false;
192
+ }
193
+ const elLeft = this.computeOffset(element, 'left');
194
+ if (elLeft === null) {
195
+ return false;
196
+ }
197
+ // Consider elements as scrolled into view when there is no viewport overflow.
198
+ // The calculation of whether an element is scrolled into view may be wrong by a few pixels if the viewport contains elements with decimal sizes.
199
+ // This can happen because `offsetLeft` and `offsetTop` operate on an integer (not a decimal), losing precision that can accumulate.
200
+ // To avoid incorrect calculation when there is no viewport overflow, we consider all contained elements as scrolled into the view.
201
+ if (this._viewportElement.scrollWidth <= this._viewportElement.clientWidth && this._viewportElement.scrollHeight <= this._viewportElement.clientHeight) {
202
+ return true;
203
+ }
204
+ const elBottom = elTop + coerceElement(element).offsetHeight;
205
+ const elRight = elLeft + coerceElement(element).offsetWidth;
206
+ const vpTop = this._viewportElement.scrollTop;
207
+ const vpLeft = this._viewportElement.scrollLeft;
208
+ const vpBottom = vpTop + this._viewportElement.clientHeight;
209
+ const vpRight = vpLeft + this._viewportElement.clientWidth;
210
+ if (fit === 'full') {
211
+ return (elTop >= vpTop && elBottom <= vpBottom) && (elLeft >= vpLeft && elRight <= vpRight);
212
+ }
213
+ else {
214
+ return (elBottom >= vpTop && elTop <= vpBottom) && (elRight >= vpLeft && elLeft <= vpRight);
215
+ }
216
+ }
217
+ /**
218
+ * Scrolls the specified element into the viewport.
219
+ *
220
+ * @param element - the element to scroll into the viewport
221
+ * @param offset - the gap between the element and the viewport
222
+ */
223
+ scrollIntoView(element, offset = 50) {
224
+ const top = this.computeOffset(element, 'top');
225
+ if (top === null) {
226
+ return;
227
+ }
228
+ const left = this.computeOffset(element, 'left');
229
+ if (left === null) {
230
+ return;
231
+ }
232
+ this._viewportElement.scrollTop = top - offset;
233
+ this._viewportElement.scrollLeft = left - offset;
234
+ }
235
+ /**
236
+ * Computes the distance of the element to the viewport's left or top border.
237
+ *
238
+ * @return distance of the element to the viewport's left or top border, or `null` if not contained
239
+ * in the viewport or the element or any ancestor has the `display` property set to `none`.
240
+ */
241
+ computeOffset(element, border) {
242
+ let offset = 0;
243
+ let el = coerceElement(element);
244
+ do {
245
+ offset += (border === 'left' ? el.offsetLeft : el.offsetTop);
246
+ const offsetParent = el.offsetParent;
247
+ if (offsetParent === null) {
248
+ // `offsetParent` is `null` in the following situations:
249
+ // - The element or any ancestor has the `display` property set to `none`
250
+ // - The element has the position property set to fixed (Firefox returns <body>).
251
+ // - The element is <body> or <html>.
252
+ // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent.
253
+ return null;
254
+ }
255
+ if (!(offsetParent instanceof HTMLElement)) {
256
+ return null;
257
+ }
258
+ el = offsetParent;
259
+ } while (el !== this.host.nativeElement);
260
+ return offset;
261
+ }
262
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SciViewportComponent, deps: [{ token: i0.ElementRef }, { token: i1.SciNativeScrollbarTrackSizeProvider }], target: i0.ɵɵFactoryTarget.Component }); }
263
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.1", type: SciViewportComponent, isStandalone: true, selector: "sci-viewport", inputs: { scrollbarStyle: "scrollbarStyle" }, outputs: { scroll: "scroll" }, host: { listeners: { "focus": "focus()" } }, viewQueries: [{ propertyName: "setViewport", first: true, predicate: ["viewport"], descendants: true, static: true }, { propertyName: "setViewportClient", first: true, predicate: ["viewport_client"], descendants: true, static: true }], ngImport: i0, template: "<!-- viewport and viewport client -->\n<div #viewport\n class=\"viewport\"\n tabindex=\"-1\"\n sciScrollable [sciScrollableDisplayNativeScrollbar]=\"scrollbarStyle === 'native'\"\n cdkScrollable\n (scroll)=\"onScroll($event)\">\n <div #viewport_client class=\"viewport-client\" part=\"content\">\n <slot></slot>\n </div>\n</div>\n\n<!-- render emulated scrollbars which sit on-top -->\n<ng-container *ngIf=\"scrollbarStyle === 'on-top' && (nativeScrollbarTrackSizeProvider.trackSize$ | async) !== null\">\n <sci-scrollbar [direction]=\"'vscroll'\" [viewport]=\"viewport\" class=\"e2e-vertical\"></sci-scrollbar>\n <sci-scrollbar [direction]=\"'hscroll'\" [viewport]=\"viewport\" class=\"e2e-horizontal\"></sci-scrollbar>\n</ng-container>\n", styles: [":host{--sci-viewport-scrollbar-color: rgb(78, 78, 78);display:grid;grid-template-columns:100%;grid-template-rows:100%;position:relative;overflow:hidden;outline:none}:host:host-context(:not(:hover):not(:active)) sci-scrollbar:not(.scrolling){opacity:0}:host>div.viewport{display:grid;position:relative;outline:none;-webkit-overflow-scrolling:touch}:host>div.viewport>div.viewport-client{display:grid}:host>sci-scrollbar{--sci-scrollbar-color: var(--sci-viewport-scrollbar-color);position:absolute;transition-duration:1s;transition-property:opacity;transition-timing-function:ease-out}:host>sci-scrollbar.vertical{top:0;right:0;bottom:0;left:unset;width:12px}:host>sci-scrollbar.horizontal{top:unset;right:0;bottom:0;left:0;height:12px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i2.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "directive", type: SciScrollableDirective, selector: "[sciScrollable]", inputs: ["sciScrollableDisplayNativeScrollbar"] }, { kind: "component", type: SciScrollbarComponent, selector: "sci-scrollbar", inputs: ["direction", "viewport"] }], encapsulation: i0.ViewEncapsulation.ShadowDom }); }
264
+ }
265
+ export { SciViewportComponent };
266
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SciViewportComponent, decorators: [{
267
+ type: Component,
268
+ args: [{ selector: 'sci-viewport', encapsulation: ViewEncapsulation.ShadowDom, standalone: true, imports: [
269
+ NgIf,
270
+ AsyncPipe,
271
+ ScrollingModule,
272
+ SciScrollableDirective,
273
+ SciScrollbarComponent,
274
+ ], template: "<!-- viewport and viewport client -->\n<div #viewport\n class=\"viewport\"\n tabindex=\"-1\"\n sciScrollable [sciScrollableDisplayNativeScrollbar]=\"scrollbarStyle === 'native'\"\n cdkScrollable\n (scroll)=\"onScroll($event)\">\n <div #viewport_client class=\"viewport-client\" part=\"content\">\n <slot></slot>\n </div>\n</div>\n\n<!-- render emulated scrollbars which sit on-top -->\n<ng-container *ngIf=\"scrollbarStyle === 'on-top' && (nativeScrollbarTrackSizeProvider.trackSize$ | async) !== null\">\n <sci-scrollbar [direction]=\"'vscroll'\" [viewport]=\"viewport\" class=\"e2e-vertical\"></sci-scrollbar>\n <sci-scrollbar [direction]=\"'hscroll'\" [viewport]=\"viewport\" class=\"e2e-horizontal\"></sci-scrollbar>\n</ng-container>\n", styles: [":host{--sci-viewport-scrollbar-color: rgb(78, 78, 78);display:grid;grid-template-columns:100%;grid-template-rows:100%;position:relative;overflow:hidden;outline:none}:host:host-context(:not(:hover):not(:active)) sci-scrollbar:not(.scrolling){opacity:0}:host>div.viewport{display:grid;position:relative;outline:none;-webkit-overflow-scrolling:touch}:host>div.viewport>div.viewport-client{display:grid}:host>sci-scrollbar{--sci-scrollbar-color: var(--sci-viewport-scrollbar-color);position:absolute;transition-duration:1s;transition-property:opacity;transition-timing-function:ease-out}:host>sci-scrollbar.vertical{top:0;right:0;bottom:0;left:unset;width:12px}:host>sci-scrollbar.horizontal{top:unset;right:0;bottom:0;left:0;height:12px}\n"] }]
275
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.SciNativeScrollbarTrackSizeProvider }]; }, propDecorators: { setViewport: [{
276
+ type: ViewChild,
277
+ args: ['viewport', { static: true }]
278
+ }], setViewportClient: [{
279
+ type: ViewChild,
280
+ args: ['viewport_client', { static: true }]
281
+ }], scrollbarStyle: [{
282
+ type: Input
283
+ }], scroll: [{
284
+ type: Output
285
+ }], focus: [{
286
+ type: HostListener,
287
+ args: ['focus']
288
+ }] } });
289
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld3BvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vY29tcG9uZW50cy92aWV3cG9ydC9zcmMvdmlld3BvcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vY29tcG9uZW50cy92aWV3cG9ydC9zcmMvdmlld3BvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFN0gsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzlELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ3RFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDOzs7O0FBRWhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlFRztBQUNILE1BY2Esb0JBQW9CO0lBTS9CLGdCQUFnQjtJQUNoQixJQUNXLFdBQVcsQ0FBQyxRQUFvQztRQUN6RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxnQkFBZ0I7SUFDaEIsSUFDVyxpQkFBaUIsQ0FBQyxjQUEwQztRQUNyRSxJQUFJLENBQUMsZUFBZSxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN2RCxD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QUFNLEVBQUUsSUFBSSxFQUFDO2dCQU8xQixpQkFBaUI7c0JBRDNCLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQVVqQyxjQUFjO3NCQUR4QixLQUFLO2dCQWVDLE1BQU07c0JBRFosTUFBTTtnQkFPQSxLQUFLO3NCQURYLFlBQVk7dUJBQUMsT0FBTyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAxOSBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NjaU5hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZVByb3ZpZGVyfSBmcm9tICcuL25hdGl2ZS1zY3JvbGxiYXItdHJhY2stc2l6ZS1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7Y29lcmNlRWxlbWVudH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7U2NpU2Nyb2xsYWJsZURpcmVjdGl2ZX0gZnJvbSAnLi9zY3JvbGxhYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1NjaVNjcm9sbGJhckNvbXBvbmVudH0gZnJvbSAnLi9zY3JvbGxiYXIvc2Nyb2xsYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQge1Njcm9sbGluZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQge0FzeW5jUGlwZSwgTmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdmlld3BvcnQgd2l0aCBzbG90dGVkIGNvbnRlbnQgKGA8bmctY29udGVudD5gKSB1c2VkIGFzIHNjcm9sbGFibGUgY29udGVudC4gQnkgZGVmYXVsdCwgY29udGVudCBpcyBhZGRlZCB0byBhIENTUyBncmlkIGxheW91dC5cbiAqXG4gKiBUaGUgdmlld3BvcnQgY29tcG9uZW50IGRpc3BsYXlzIHNjcm9sbGJhcnMgd2hlbiBpdHMgY29udGVudCBvdmVyZmxvd3MuIFNjcm9sbGJhcnMgYXJlIGRpc3BsYXllZCBvbiB0b3Agb2YgdGhlIGNvbnRlbnQsIG5vdCBuZXh0IHRvIGl0LlxuICogVGhlIGNvbXBvbmVudCB1c2VzIHRoZSBuYXRpdmUgc2Nyb2xsYmFycyBvZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBpZiB0aGV5IGFyZSBhbHJlYWR5IHNpdHRpbmcgb24gdG9wLCBvciBmYWxscyBiYWNrIGFuZCByZW5kZXJzIHNjcm9sbGJhcnMgb24gdG9wIG90aGVyd2lzZS5cbiAqIFRoZSB2aWV3cG9ydCByZW1haW5zIG5hdGl2ZWx5IHNjcm9sbGFibGUgd2l0aCB0aGUgbmF0aXZlIHNjcm9sbGJhcnMgc2hpZnRlZCBvdXQgb2YgdGhlIHZpZXdwb3J0J3MgdmlzaWJsZSBhcmVhLiBDb25zZXF1ZW50bHksIHRoZSB2aWV3cG9ydCBrZWVwcyBzdXBwb3J0aW5nXG4gKiBuYXRpdmUgc2Nyb2xsaW5nIGZlYXR1cmVzIHN1Y2ggYXMgdG91Y2ggZ2VzdHVyZXMsIHNjcm9sbCBzcGVlZCBhY2NlbGVyYXRpb24sIG9yIHNjcm9sbGluZyBuZWFyIHRoZSB2aWV3cG9ydCBlZGdlcyBkdXJpbmcgZHJhZy1hbmQtZHJvcCBvcGVyYXRpb25zLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxzY2ktdmlld3BvcnQ+XG4gKiAgIHlvdXIgY29udGVudFxuICogPC9zY2ktdmlld3BvcnQ+XG4gKiBgYGBcbiAqXG4gKiAjIyBBZGRpbmcgdGhlIHZpZXdwb3J0IHRvIGEgbGF5b3V0XG4gKlxuICogVHlwaWNhbGx5IHlvdSB3b3VsZCBhZGQgdGhlIHZpZXdwb3J0IGNvbXBvbmVudCB0byBhIGZsZXhpYmxlIGxheW91dCwgZmlsbGluZyB0aGUgcmVtYWluaW5nIHNwYWNlIHZlcnRpY2FsbHkgYW5kIGhvcml6b250YWxseSwgc3VjaCBhcyBhIGZsZXhib3ggY29udGFpbmVyXG4gKiB3aXRoIHRoZSB2aWV3cG9ydCdzIGBmbGV4YCBDU1MgcHJvcGVydHkgc2V0IHRvIGVpdGhlciBgZmxleDogYXV0b2Agb3IgYGZsZXg6IDEgMSAwYC5cbiAqXG4gKiBUaGUgdmlld3BvcnQgaXMgc2l6ZWQgYWNjb3JkaW5nIHRvIGl0cyBjb250ZW50IHdpZHRoIGFuZCBoZWlnaHQuIEl0IGdyb3dzIHRvIGFic29yYiBhbnkgZnJlZSBzcGFjZSwgdGh1cyBvdmVyZmxvd2luZyBpdHMgY29udGVudCBvbmx5IHdoZW4gZW5jb3VudGVyaW5nXG4gKiBhIGxheW91dCBjb25zdHJhaW50LiBEZXBlbmRpbmcgb24gdGhlIGxheW91dCwgZGlmZmVyZW50IHN0ZXBzIG1heSBiZSBuZWNlc3NhcnkgdG8gcHJldmVudCB0aGUgdmlld3BvcnQgZnJvbSBncm93aW5nIHRvIGluZmluaXR5LlxuICpcbiAqIC0gSWYgcHJhY3RpY2FsLCBnaXZlIHRoZSB2aWV3cG9ydCBhIGZpeGVkIHNpemUgb3IgYSBtYXhpbXVtIHNpemUuXG4gKiAtIElmIHlvdSBhZGQgdGhlIHZpZXdwb3J0IHRvIGEgZmxleGJveCBsYXlvdXQsIG1ha2Ugc3VyZSB0aGF0IGl0IGNhbm5vdCBleGNlZWQgdGhlIGF2YWlsYWJsZSBzcGFjZS4gSW5zdGVhZCwgdGhlIHZpZXdwb3J0IHNob3VsZCBmaWxsIHRoZSByZW1haW5pbmcgc3BhY2UsXG4gKiAgIHZlcnRpY2FsbHkgYW5kIGhvcml6b250YWxseS4gQmUgYXdhcmUgdGhhdCwgYnkgZGVmYXVsdCwgYSBmbGV4IGl0ZW0gZG9lcyBub3Qgc2hyaW5rIGJlbG93IGl0cyBtaW5pbXVtIGNvbnRlbnQgc2l6ZS4gVG8gY2hhbmdlIHRoaXMsIHNldCB0aGUgdmlld3BvcnQnc1xuICogICBgZmxleC1iYXNpc2AgdG8gYDBgIChpbnN0ZWFkIG9mIGBhdXRvYCksIG9yIHVzZSB0aGUgQ1NTIHNob3J0aGFuZCBwcm9wZXJ0eSBgZmxleDogMSAxIDBgLiBUaGUgYGZsZXgtYmFzaXNgIGRlZmluZXMgdGhlIGRlZmF1bHQgc2l6ZSBvZiBhIGZsZXggaXRlbSBiZWZvcmVcbiAqICAgdGhlIHJlbWFpbmluZyBleHRyYSBzcGFjZSBpcyBkaXN0cmlidXRlZC4gSWYgdGhlIHZpZXdwb3J0IGRvZXMgbm90IGFwcGVhciBhZnRlciBzZXR0aW5nIHRoaXMgcHJvcGVydHksIGNoZWNrIGl0cyBwYXJlbnQgZWxlbWVudHMnIGNvbnRlbnQgc2l6ZXMuXG4gKiAgIEFzIGFuIGFsdGVybmF0aXZlIHRvIHNldHRpbmcgYGZsZXg6IDEgMSAwYCwgY2hhbmdlIHRoZSBzZXR0aW5nIHRvIGBmbGV4OiBhdXRvYCBhbmQgaGlkZSB0aGUgb3ZlcmZsb3cgaW4gdGhlIHBhcmVudCBlbGVtZW50LCBhcyBmb2xsb3dzOiBgb3ZlcmZsb3c6IGhpZGRlbmAuXG4gKiAgIEFub3RoZXIgYXBwcm9hY2ggd291bGQgYmUgdG8gc2V0IHRoZSBtaW5pbXVtIGhlaWdodCBvZiBhbGwgcGFyZW50cyB0byBgMGAsIGFzIGZvbGxvd3M6IGBtaW4taGVpZ2h0OiAwYC5cbiAqXG4gKiAgIEZvciB0aGUgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZmxleCBsYXlvdXQgYW5kIGl0cyBmZWF0dXJlcywgcmVmZXIgdG8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZsZXguXG4gKlxuICpcbiAqICMjIExheW91dGluZyB0aGUgdmlld3BvcnQncyBzbG90dGVkIGNvbnRlbnRcbiAqXG4gKiBCeSBkZWZhdWx0LCB0aGUgdmlld3BvcnQncyBjb250ZW50IGlzIGFkZGVkIHRvIGEgQ1NTIGdyaWQgY29udGFpbmVyIHdpdGggYSBzaW5nbGUgY29sdW1uLCBmaWxsaW5nIHJlbWFpbmluZyBzcGFjZSB2ZXJ0aWNhbGx5IGFuZCBob3Jpem9udGFsbHkuXG4gKiBVc2luZyB0aGUgYDo6cGFydChjb250ZW50KWAgcHNldWRvIGVsZW1lbnQgc2VsZWN0b3IsIHlvdSBjYW4gY29uZmlndXJlIHRoZSBncmlkIGNvbnRhaW5lciBvciBhcHBseSBhIGRpZmZlcmVudCBsYXlvdXQsIHN1Y2ggYXMgYSBmbGV4IG9yIGZsb3cgbGF5b3V0LlxuICpcbiAqICMjIyMgRXhhbXBsZSBvZiBhZGRpbmcgc2xvdHRlZCBjb250ZW50IHRvIGEgQ1NTIGZsZXggY29udGFpbmVyLlxuICogYGBgY3NzXG4gKiBzY2ktdmlld3BvcnQ6OnBhcnQoY29udGVudCkge1xuICogICBkaXNwbGF5OiBmbGV4O1xuICogICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICogfVxuICogYGBgXG4gKlxuICogIyMjIyBFeGFtcGxlIG9mIGNvbmZpZ3VyaW5nIENTUyBncmlkIGNvbnRhaW5lciB3aXRoIHR3byBjb2x1bW5zXG4gKiBgYGBjc3NcbiAqIHNjaS12aWV3cG9ydDo6cGFydChjb250ZW50KSB7XG4gKiAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjtcbiAqICAgZ2FwOiAxZW07XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBTdHlsaW5nIG9mIHNjcm9sbGJhcnNcbiAqXG4gKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgQ1NTIHZhcmlhYmxlcyB0byBjb250cm9sIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzY3JvbGxiYXI6XG4gKlxuICogLSBzY2ktdmlld3BvcnQtc2Nyb2xsYmFyLWNvbG9yOiAgICAgU2V0cyB0aGUgY29sb3Igb2YgdGhlIHNjcm9sbGJhciAoYnkgZGVmYXVsdCwgdXNlcyBgcmdiKDc4LCA3OCwgNzgpYCkuXG4gKlxuICogYGBgY3NzXG4gKiBzY2ktdmlld3BvcnQge1xuICogICAtLXNjaS12aWV3cG9ydC1zY3JvbGxiYXItY29sb3I6IGJsdWU7XG4gKiB9XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2NpLXZpZXdwb3J0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZXdwb3J0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdmlld3BvcnQuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTmdJZixcbiAgICBBc3luY1BpcGUsXG4gICAgU2Nyb2xsaW5nTW9kdWxlLFxuICAgIFNjaVNjcm9sbGFibGVEaXJlY3RpdmUsXG4gICAgU2NpU2Nyb2xsYmFyQ29tcG9uZW50LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTY2lWaWV3cG9ydENvbXBvbmVudCB7XG5cbiAgcHJpdmF0ZSBfdmlld3BvcnRFbGVtZW50ITogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgX3ZpZXdwb3J0Q2xpZW50ITogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgX3Njcm9sbGJhclN0eWxlOiBTY3JvbGxiYXJTdHlsZSA9ICdvbi10b3AnO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgQFZpZXdDaGlsZCgndmlld3BvcnQnLCB7c3RhdGljOiB0cnVlfSlcbiAgcHVibGljIHNldCBzZXRWaWV3cG9ydCh2aWV3cG9ydDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4pIHtcbiAgICB0aGlzLl92aWV3cG9ydEVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KHZpZXdwb3J0KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgQFZpZXdDaGlsZCgndmlld3BvcnRfY2xpZW50Jywge3N0YXRpYzogdHJ1ZX0pXG4gIHB1YmxpYyBzZXQgc2V0Vmlld3BvcnRDbGllbnQodmlld3BvcnRDbGllbnQ6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+KSB7XG4gICAgdGhpcy5fdmlld3BvcnRDbGllbnQgPSBjb2VyY2VFbGVtZW50KHZpZXdwb3J0Q2xpZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHRvIHVzZSBuYXRpdmUgc2Nyb2xsYmFycyBvciwgd2hpY2ggaXMgYnkgZGVmYXVsdCwgZW11bGF0ZWQgc2Nyb2xsYmFycyB0aGF0IHNpdCBvbiB0b3Agb2YgdGhlIHZpZXdwb3J0IGNsaWVudC5cbiAgICogSW4gdGhlIGxhdHRlciwgdGhlIHZpZXdwb3J0IGNsaWVudCByZW1haW5zIG5hdGl2ZWx5IHNjcm9sbGFibGUuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNjcm9sbGJhclN0eWxlKHNjcm9sbGJhclN0eWxlOiBTY3JvbGxiYXJTdHlsZSkge1xuICAgIHRoaXMuX3Njcm9sbGJhclN0eWxlID0gc2Nyb2xsYmFyU3R5bGUgfHwgJ29uLXRvcCc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNjcm9sbGJhclN0eWxlKCk6IFNjcm9sbGJhclN0eWxlIHtcbiAgICByZXR1cm4gdGhpcy5fc2Nyb2xsYmFyU3R5bGU7XG4gIH1cblxuICAvKipcbiAgICogRW1pdHMgdXBvbiBhIHNjcm9sbCBldmVudC5cbiAgICpcbiAgICogWW91IGNhbiBhZGQgW3NjaURpbWVuc2lvbl0gZGlyZWN0aXZlIHRvIHRoZSB2aWV3cG9ydCBvciB2aWV3cG9ydCBjbGllbnQgdG8gYmUgbm90aWZpZWQgYWJvdXQgbGF5b3V0IGNoYW5nZXMuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgaG9zdDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sIHB1YmxpYyBuYXRpdmVTY3JvbGxiYXJUcmFja1NpemVQcm92aWRlcjogU2NpTmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplUHJvdmlkZXIpIHtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJylcbiAgcHVibGljIGZvY3VzKCk6IHZvaWQgeyAvLyBkbyBub3QgcmVuYW1lIHRvIGV4cG9zZSB0aGUgc2FtZSBmb2N1cyBtZXRob2QgbGlrZSBgSFRNTEVsZW1lbnQuZm9jdXMoKWAuXG4gICAgdGhpcy5fdmlld3BvcnRFbGVtZW50Py5mb2N1cygpO1xuICB9XG5cbiAgcHVibGljIG9uU2Nyb2xsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUgdmlld3BvcnQgY2xpZW50IGlzIHNjcm9sbGVkIHZlcnRpY2FsbHkuXG4gICAqXG4gICAqIEBzZWUgRWxlbWVudC5zY3JvbGxUb3BcbiAgICovXG4gIHB1YmxpYyBnZXQgc2Nyb2xsVG9wKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3A7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHRoZSB2aWV3cG9ydCBjbGllbnQgaXMgc2Nyb2xsZWQgdmVydGljYWxseS5cbiAgICpcbiAgICogQHNlZSBFbGVtZW50LnNjcm9sbFRvcFxuICAgKi9cbiAgcHVibGljIHNldCBzY3JvbGxUb3Aoc2Nyb2xsVG9wOiBudW1iZXIpIHtcbiAgICB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsVG9wID0gc2Nyb2xsVG9wO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUgdmlld3BvcnQgY2xpZW50IGlzIHNjcm9sbGVkIGhvcml6b250YWxseS5cbiAgICpcbiAgICogQHNlZSBFbGVtZW50LnNjcm9sbExlZnRcbiAgICovXG4gIHB1YmxpYyBnZXQgc2Nyb2xsTGVmdCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgdGhlIHZpZXdwb3J0IGNsaWVudCBpcyBzY3JvbGxlZCBob3Jpem9udGFsbHkuXG4gICAqXG4gICAqIEBzZWUgRWxlbWVudC5zY3JvbGxMZWZ0XG4gICAqL1xuICBwdWJsaWMgc2V0IHNjcm9sbExlZnQoc2Nyb2xsTGVmdDogbnVtYmVyKSB7XG4gICAgdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgdmlld3BvcnQgY2xpZW50LlxuICAgKlxuICAgKiBAc2VlIEVsZW1lbnQuc2Nyb2xsSGVpZ2h0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHNjcm9sbEhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB2aWV3cG9ydCBjbGllbnQuXG4gICAqXG4gICAqIEBzZWUgRWxlbWVudC5zY3JvbGxXaWR0aFxuICAgKi9cbiAgcHVibGljIGdldCBzY3JvbGxXaWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmlld3BvcnQge0hUTUxFbGVtZW50fS5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmlld3BvcnRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5fdmlld3BvcnRFbGVtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZpZXdwb3J0IGNsaWVudCB7SFRNTEVsZW1lbnR9LlxuICAgKi9cbiAgcHVibGljIGdldCB2aWV3cG9ydENsaWVudEVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLl92aWV3cG9ydENsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIHRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWRcbiAgICogQHBhcmFtIGZpdCAtIGNvbnRyb2wgaWYgdGhlIGVsZW1lbnQgbXVzdCBmdWxseSBvciBwYXJ0aWFsbHkgZml0IGludG8gdGhlIHZpZXdwb3J0XG4gICAqIEByZXR1cm4gYHRydWVgIGlmIHRoZSBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdGhlIHZpZXdwb3J0LCBvciBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIHB1YmxpYyBpc0VsZW1lbnRJblZpZXcoZWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gfCBIVE1MRWxlbWVudCwgZml0OiAnZnVsbCcgfCAncGFydGlhbCcpOiBib29sZWFuIHtcbiAgICBjb25zdCBlbFRvcCA9IHRoaXMuY29tcHV0ZU9mZnNldChlbGVtZW50LCAndG9wJyk7XG4gICAgaWYgKGVsVG9wID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGVsTGVmdCA9IHRoaXMuY29tcHV0ZU9mZnNldChlbGVtZW50LCAnbGVmdCcpO1xuICAgIGlmIChlbExlZnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBDb25zaWRlciBlbGVtZW50cyBhcyBzY3JvbGxlZCBpbnRvIHZpZXcgd2hlbiB0aGVyZSBpcyBubyB2aWV3cG9ydCBvdmVyZmxvdy5cbiAgICAvLyBUaGUgY2FsY3VsYXRpb24gb2Ygd2hldGhlciBhbiBlbGVtZW50IGlzIHNjcm9sbGVkIGludG8gdmlldyBtYXkgYmUgd3JvbmcgYnkgYSBmZXcgcGl4ZWxzIGlmIHRoZSB2aWV3cG9ydCBjb250YWlucyBlbGVtZW50cyB3aXRoIGRlY2ltYWwgc2l6ZXMuXG4gICAgLy8gVGhpcyBjYW4gaGFwcGVuIGJlY2F1c2UgYG9mZnNldExlZnRgIGFuZCBgb2Zmc2V0VG9wYCBvcGVyYXRlIG9uIGFuIGludGVnZXIgKG5vdCBhIGRlY2ltYWwpLCBsb3NpbmcgcHJlY2lzaW9uIHRoYXQgY2FuIGFjY3VtdWxhdGUuXG4gICAgLy8gVG8gYXZvaWQgaW5jb3JyZWN0IGNhbGN1bGF0aW9uIHdoZW4gdGhlcmUgaXMgbm8gdmlld3BvcnQgb3ZlcmZsb3csIHdlIGNvbnNpZGVyIGFsbCBjb250YWluZWQgZWxlbWVudHMgYXMgc2Nyb2xsZWQgaW50byB0aGUgdmlldy5cbiAgICBpZiAodGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFdpZHRoIDw9IHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5jbGllbnRXaWR0aCAmJiB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsSGVpZ2h0IDw9IHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5jbGllbnRIZWlnaHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGVsQm90dG9tID0gZWxUb3AgKyBjb2VyY2VFbGVtZW50KGVsZW1lbnQpLm9mZnNldEhlaWdodDtcbiAgICBjb25zdCBlbFJpZ2h0ID0gZWxMZWZ0ICsgY29lcmNlRWxlbWVudChlbGVtZW50KS5vZmZzZXRXaWR0aDtcblxuICAgIGNvbnN0IHZwVG9wID0gdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbFRvcDtcbiAgICBjb25zdCB2cExlZnQgPSB0aGlzLl92aWV3cG9ydEVsZW1lbnQuc2Nyb2xsTGVmdDtcbiAgICBjb25zdCB2cEJvdHRvbSA9IHZwVG9wICsgdGhpcy5fdmlld3BvcnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICBjb25zdCB2cFJpZ2h0ID0gdnBMZWZ0ICsgdGhpcy5fdmlld3BvcnRFbGVtZW50LmNsaWVudFdpZHRoO1xuXG4gICAgaWYgKGZpdCA9PT0gJ2Z1bGwnKSB7XG4gICAgICByZXR1cm4gKGVsVG9wID49IHZwVG9wICYmIGVsQm90dG9tIDw9IHZwQm90dG9tKSAmJiAoZWxMZWZ0ID49IHZwTGVmdCAmJiBlbFJpZ2h0IDw9IHZwUmlnaHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHJldHVybiAoZWxCb3R0b20gPj0gdnBUb3AgJiYgZWxUb3AgPD0gdnBCb3R0b20pICYmIChlbFJpZ2h0ID49IHZwTGVmdCAmJiBlbExlZnQgPD0gdnBSaWdodCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNjcm9sbHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhlIHZpZXdwb3J0LlxuICAgKlxuICAgKiBAcGFyYW0gZWxlbWVudCAtIHRoZSBlbGVtZW50IHRvIHNjcm9sbCBpbnRvIHRoZSB2aWV3cG9ydFxuICAgKiBAcGFyYW0gb2Zmc2V0IC0gdGhlIGdhcCBiZXR3ZWVuIHRoZSBlbGVtZW50IGFuZCB0aGUgdmlld3BvcnRcbiAgICovXG4gIHB1YmxpYyBzY3JvbGxJbnRvVmlldyhlbGVtZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiB8IEhUTUxFbGVtZW50LCBvZmZzZXQ6IG51bWJlciA9IDUwKTogdm9pZCB7XG4gICAgY29uc3QgdG9wID0gdGhpcy5jb21wdXRlT2Zmc2V0KGVsZW1lbnQsICd0b3AnKTtcbiAgICBpZiAodG9wID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGxlZnQgPSB0aGlzLmNvbXB1dGVPZmZzZXQoZWxlbWVudCwgJ2xlZnQnKTtcbiAgICBpZiAobGVmdCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3ZpZXdwb3J0RWxlbWVudC5zY3JvbGxUb3AgPSB0b3AgLSBvZmZzZXQ7XG4gICAgdGhpcy5fdmlld3BvcnRFbGVtZW50LnNjcm9sbExlZnQgPSBsZWZ0IC0gb2Zmc2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHRoZSBkaXN0YW5jZSBvZiB0aGUgZWxlbWVudCB0byB0aGUgdmlld3BvcnQncyBsZWZ0IG9yIHRvcCBib3JkZXIuXG4gICAqXG4gICAqIEByZXR1cm4gZGlzdGFuY2Ugb2YgdGhlIGVsZW1lbnQgdG8gdGhlIHZpZXdwb3J0J3MgbGVmdCBvciB0b3AgYm9yZGVyLCBvciBgbnVsbGAgaWYgbm90IGNvbnRhaW5lZFxuICAgKiAgICAgICAgIGluIHRoZSB2aWV3cG9ydCBvciB0aGUgZWxlbWVudCBvciBhbnkgYW5jZXN0b3IgaGFzIHRoZSBgZGlzcGxheWAgcHJvcGVydHkgc2V0IHRvIGBub25lYC5cbiAgICovXG4gIHB1YmxpYyBjb21wdXRlT2Zmc2V0KGVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgSFRNTEVsZW1lbnQsIGJvcmRlcjogJ2xlZnQnIHwgJ3RvcCcpOiBudW1iZXIgfCBudWxsIHtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBsZXQgZWwgPSBjb2VyY2VFbGVtZW50KGVsZW1lbnQpO1xuICAgIGRvIHtcbiAgICAgIG9mZnNldCArPSAoYm9yZGVyID09PSAnbGVmdCcgPyBlbC5vZmZzZXRMZWZ0IDogZWwub2Zmc2V0VG9wKTtcbiAgICAgIGNvbnN0IG9mZnNldFBhcmVudCA9IGVsLm9mZnNldFBhcmVudDtcbiAgICAgIGlmIChvZmZzZXRQYXJlbnQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gYG9mZnNldFBhcmVudGAgaXMgYG51bGxgIGluIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczpcbiAgICAgICAgLy8gLSBUaGUgZWxlbWVudCBvciBhbnkgYW5jZXN0b3IgaGFzIHRoZSBgZGlzcGxheWAgcHJvcGVydHkgc2V0IHRvIGBub25lYFxuICAgICAgICAvLyAtIFRoZSBlbGVtZW50IGhhcyB0aGUgcG9zaXRpb24gcHJvcGVydHkgc2V0IHRvIGZpeGVkIChGaXJlZm94IHJldHVybnMgPGJvZHk+KS5cbiAgICAgICAgLy8gLSBUaGUgZWxlbWVudCBpcyA8Ym9keT4gb3IgPGh0bWw+LlxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0hUTUxFbGVtZW50L29mZnNldFBhcmVudC5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoIShvZmZzZXRQYXJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBlbCA9IG9mZnNldFBhcmVudDtcbiAgICB9IHdoaWxlIChlbCAhPT0gdGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgcmV0dXJuIG9mZnNldDtcbiAgfVxufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBzY3JvbGxiYXIgc3R5bGUuXG4gKi9cbmV4cG9ydCB0eXBlIFNjcm9sbGJhclN0eWxlID0gJ25hdGl2ZScgfCAnb24tdG9wJyB8ICdoaWRkZW4nO1xuIiwiPCEtLSB2aWV3cG9ydCBhbmQgdmlld3BvcnQgY2xpZW50IC0tPlxuPGRpdiAjdmlld3BvcnRcbiAgICAgY2xhc3M9XCJ2aWV3cG9ydFwiXG4gICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICBzY2lTY3JvbGxhYmxlIFtzY2lTY3JvbGxhYmxlRGlzcGxheU5hdGl2ZVNjcm9sbGJhcl09XCJzY3JvbGxiYXJTdHlsZSA9PT0gJ25hdGl2ZSdcIlxuICAgICBjZGtTY3JvbGxhYmxlXG4gICAgIChzY3JvbGwpPVwib25TY3JvbGwoJGV2ZW50KVwiPlxuICA8ZGl2ICN2aWV3cG9ydF9jbGllbnQgY2xhc3M9XCJ2aWV3cG9ydC1jbGllbnRcIiBwYXJ0PVwiY29udGVudFwiPlxuICAgIDxzbG90Pjwvc2xvdD5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSByZW5kZXIgZW11bGF0ZWQgc2Nyb2xsYmFycyB3aGljaCBzaXQgb24tdG9wIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInNjcm9sbGJhclN0eWxlID09PSAnb24tdG9wJyAmJiAobmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplUHJvdmlkZXIudHJhY2tTaXplJCB8IGFzeW5jKSAhPT0gbnVsbFwiPlxuICA8c2NpLXNjcm9sbGJhciBbZGlyZWN0aW9uXT1cIid2c2Nyb2xsJ1wiIFt2aWV3cG9ydF09XCJ2aWV3cG9ydFwiIGNsYXNzPVwiZTJlLXZlcnRpY2FsXCI+PC9zY2ktc2Nyb2xsYmFyPlxuICA8c2NpLXNjcm9sbGJhciBbZGlyZWN0aW9uXT1cIidoc2Nyb2xsJ1wiIFt2aWV3cG9ydF09XCJ2aWV3cG9ydFwiIGNsYXNzPVwiZTJlLWhvcml6b250YWxcIj48L3NjaS1zY3JvbGxiYXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
@@ -0,0 +1,43 @@
1
+ /*
2
+ * Copyright (c) 2018-2019 Swiss Federal Railways
3
+ *
4
+ * This program and the accompanying materials are made
5
+ * available under the terms of the Eclipse Public License 2.0
6
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
7
+ *
8
+ * SPDX-License-Identifier: EPL-2.0
9
+ */
10
+ import { NgModule } from '@angular/core';
11
+ import { SciViewportComponent } from './viewport.component';
12
+ import { SciScrollbarComponent } from './scrollbar/scrollbar.component';
13
+ import { SciScrollableDirective } from './scrollable.directive';
14
+ import * as i0 from "@angular/core";
15
+ /**
16
+ * Provides a viewport component with scrollbars that sit on top of the viewport client.
17
+ */
18
+ class SciViewportModule {
19
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SciViewportModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
20
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.1", ngImport: i0, type: SciViewportModule, imports: [SciViewportComponent,
21
+ SciScrollbarComponent,
22
+ SciScrollableDirective], exports: [SciViewportComponent,
23
+ SciScrollbarComponent,
24
+ SciScrollableDirective] }); }
25
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SciViewportModule, imports: [SciViewportComponent] }); }
26
+ }
27
+ export { SciViewportModule };
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SciViewportModule, decorators: [{
29
+ type: NgModule,
30
+ args: [{
31
+ imports: [
32
+ SciViewportComponent,
33
+ SciScrollbarComponent,
34
+ SciScrollableDirective,
35
+ ],
36
+ exports: [
37
+ SciViewportComponent,
38
+ SciScrollbarComponent,
39
+ SciScrollableDirective,
40
+ ],
41
+ }]
42
+ }] });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld3BvcnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vY29tcG9uZW50cy92aWV3cG9ydC9zcmMvdmlld3BvcnQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQzs7QUFFOUQ7O0dBRUc7QUFDSCxNQVlhLGlCQUFpQjs4R0FBakIsaUJBQWlCOytHQUFqQixpQkFBaUIsWUFWMUIsb0JBQW9CO1lBQ3BCLHFCQUFxQjtZQUNyQixzQkFBc0IsYUFHdEIsb0JBQW9CO1lBQ3BCLHFCQUFxQjtZQUNyQixzQkFBc0I7K0dBR2IsaUJBQWlCLFlBVjFCLG9CQUFvQjs7U0FVWCxpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFaN0IsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1Asb0JBQW9CO3dCQUNwQixxQkFBcUI7d0JBQ3JCLHNCQUFzQjtxQkFDdkI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLG9CQUFvQjt3QkFDcEIscUJBQXFCO3dCQUNyQixzQkFBc0I7cUJBQ3ZCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1NjaVZpZXdwb3J0Q29tcG9uZW50fSBmcm9tICcuL3ZpZXdwb3J0LmNvbXBvbmVudCc7XG5pbXBvcnQge1NjaVNjcm9sbGJhckNvbXBvbmVudH0gZnJvbSAnLi9zY3JvbGxiYXIvc2Nyb2xsYmFyLmNvbXBvbmVudCc7XG5pbXBvcnQge1NjaVNjcm9sbGFibGVEaXJlY3RpdmV9IGZyb20gJy4vc2Nyb2xsYWJsZS5kaXJlY3RpdmUnO1xuXG4vKipcbiAqIFByb3ZpZGVzIGEgdmlld3BvcnQgY29tcG9uZW50IHdpdGggc2Nyb2xsYmFycyB0aGF0IHNpdCBvbiB0b3Agb2YgdGhlIHZpZXdwb3J0IGNsaWVudC5cbiAqL1xuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIFNjaVZpZXdwb3J0Q29tcG9uZW50LFxuICAgIFNjaVNjcm9sbGJhckNvbXBvbmVudCxcbiAgICBTY2lTY3JvbGxhYmxlRGlyZWN0aXZlLFxuICBdLFxuICBleHBvcnRzOiBbXG4gICAgU2NpVmlld3BvcnRDb21wb25lbnQsXG4gICAgU2NpU2Nyb2xsYmFyQ29tcG9uZW50LFxuICAgIFNjaVNjcm9sbGFibGVEaXJlY3RpdmUsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNjaVZpZXdwb3J0TW9kdWxlIHtcbn1cbiJdfQ==
@@ -1,6 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { EventEmitter, Directive, Output, Input, NgModule } from '@angular/core';
3
- import { CommonModule } from '@angular/common';
4
3
  import { Subject } from 'rxjs';
5
4
  import { takeUntil } from 'rxjs/operators';
6
5
  import { fromDimension$, captureElementDimension } from '@scion/toolkit/observable';
@@ -67,14 +66,15 @@ class SciDimensionDirective {
67
66
  ngOnDestroy() {
68
67
  this._destroy$.next();
69
68
  }
69
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SciDimensionDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
70
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.1", type: SciDimensionDirective, isStandalone: true, selector: "[sciDimension]", inputs: { emitOutsideAngular: "emitOutsideAngular" }, outputs: { dimensionChange: "sciDimensionChange" }, exportAs: ["sciDimension"], ngImport: i0 }); }
70
71
  }
71
- SciDimensionDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: SciDimensionDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
72
- SciDimensionDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.0.2", type: SciDimensionDirective, selector: "[sciDimension]", inputs: { emitOutsideAngular: "emitOutsideAngular" }, outputs: { dimensionChange: "sciDimensionChange" }, exportAs: ["sciDimension"], ngImport: i0 });
73
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: SciDimensionDirective, decorators: [{
72
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SciDimensionDirective, decorators: [{
74
73
  type: Directive,
75
74
  args: [{
76
75
  selector: '[sciDimension]',
77
76
  exportAs: 'sciDimension',
77
+ standalone: true,
78
78
  }]
79
79
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { dimensionChange: [{
80
80
  type: Output,
@@ -98,17 +98,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImpor
98
98
  * @see fromDimension$
99
99
  */
100
100
  class SciDimensionModule {
101
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SciDimensionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
102
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.1", ngImport: i0, type: SciDimensionModule, imports: [SciDimensionDirective], exports: [SciDimensionDirective] }); }
103
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SciDimensionModule }); }
101
104
  }
102
- SciDimensionModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: SciDimensionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
103
- SciDimensionModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.2", ngImport: i0, type: SciDimensionModule, declarations: [SciDimensionDirective], imports: [CommonModule], exports: [SciDimensionDirective] });
104
- SciDimensionModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: SciDimensionModule, imports: [CommonModule] });
105
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: SciDimensionModule, decorators: [{
105
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: SciDimensionModule, decorators: [{
106
106
  type: NgModule,
107
107
  args: [{
108
108
  imports: [
109
- CommonModule,
110
- ],
111
- declarations: [
112
109
  SciDimensionDirective,
113
110
  ],
114
111
  exports: [
@@ -126,6 +123,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImpor
126
123
  *
127
124
  * SPDX-License-Identifier: EPL-2.0
128
125
  */
126
+ /*
127
+ * Secondary entrypoint: '@scion/components/dimension'
128
+ *
129
+ * @see https://github.com/ng-packagr/ng-packagr/blob/master/docs/secondary-entrypoints.md
130
+ */
129
131
 
130
132
  /**
131
133
  * Generated bundle index. Do not edit.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scion-components-dimension.mjs","sources":["../../../../projects/scion/components/dimension/src/dimension.directive.ts","../../../../projects/scion/components/dimension/src/dimension.module.ts","../../../../projects/scion/components/dimension/src/public_api.ts","../../../../projects/scion/components/dimension/src/scion-components-dimension.ts"],"sourcesContent":["/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Directive, ElementRef, EventEmitter, Input, NgZone, OnDestroy, OnInit, Output} from '@angular/core';\nimport {Subject} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\nimport {captureElementDimension, Dimension, fromDimension$} from '@scion/toolkit/observable';\n\n/**\n * Allows observing changes to host element's size.\n *\n * See {@link fromDimension$} Observable for more information.\n *\n * ---\n * Usage:\n *\n * <div sciDimension (sciDimensionChange)=\"onDimensionChange($event)\"></div>\n */\n@Directive({\n selector: '[sciDimension]',\n exportAs: 'sciDimension',\n standalone: true,\n})\nexport class SciDimensionDirective implements OnInit, OnDestroy {\n\n private readonly _host: HTMLElement;\n private _destroy$ = new Subject<void>();\n\n /**\n * Upon subscription, it emits the host element's dimension, and then continuously emits when the dimension of the host element changes.\n */\n @Output('sciDimensionChange') // eslint-disable-line @angular-eslint/no-output-rename\n public dimensionChange = new EventEmitter<SciDimension>();\n\n /**\n * Controls if to emit a dimension change inside or outside of the Angular zone.\n * If emitted outside of the Angular zone no change detection cycle is triggered.\n *\n * By default, if not specified, emits inside the Angular zone.\n */\n @Input()\n public emitOutsideAngular = false;\n\n constructor(host: ElementRef<HTMLElement>, private _ngZone: NgZone) {\n this._host = host.nativeElement;\n }\n\n public ngOnInit(): void {\n this.installDimensionListener();\n }\n\n private installDimensionListener(): void {\n this._ngZone.runOutsideAngular(() => {\n fromDimension$(this._host)\n .pipe(takeUntil(this._destroy$))\n .subscribe((dimension: SciDimension) => {\n if (this.emitOutsideAngular) {\n this.dimensionChange.emit(dimension);\n }\n else {\n this._ngZone.run(() => this.dimensionChange.emit(dimension));\n }\n });\n });\n }\n\n /**\n * Returns the current dimension of its host element.\n */\n public get dimension(): SciDimension {\n return captureElementDimension(this._host);\n }\n\n public ngOnDestroy(): void {\n this._destroy$.next();\n }\n}\n\n/**\n * Represents the dimension of an element.\n */\nexport type SciDimension = Dimension;\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {NgModule} from '@angular/core';\nimport {SciDimensionDirective} from './dimension.directive';\n\n/**\n * Provides a directive for observing changes to the size of the host element.\n *\n * @see fromDimension$\n */\n@NgModule({\n imports: [\n SciDimensionDirective,\n ],\n exports: [\n SciDimensionDirective,\n ],\n})\nexport class SciDimensionModule {\n}\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\n/*\n * Secondary entrypoint: '@scion/components/dimension'\n *\n * @see https://github.com/ng-packagr/ng-packagr/blob/master/docs/secondary-entrypoints.md\n */\nexport {SciDimensionModule} from './dimension.module';\nexport {SciDimensionDirective, SciDimension} from './dimension.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}