@scion/components 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -0
- package/_components.scss +1 -0
- package/_index.scss +23 -0
- package/dimension/dimension.directive.d.ts +43 -0
- package/dimension/dimension.module.d.ts +13 -0
- package/dimension/package.json +10 -0
- package/dimension/public_api.d.ts +2 -0
- package/dimension/scion-components-dimension.d.ts +5 -0
- package/esm2020/dimension/dimension.directive.mjs +83 -0
- package/esm2020/dimension/dimension.module.mjs +40 -0
- package/esm2020/dimension/public_api.mjs +17 -0
- package/esm2020/dimension/scion-components-dimension.mjs +5 -0
- package/esm2020/public-api.mjs +11 -0
- package/esm2020/sashbox/element-ref.directive.mjs +27 -0
- package/esm2020/sashbox/public_api.mjs +18 -0
- package/esm2020/sashbox/sash-initializer.directive.mjs +32 -0
- package/esm2020/sashbox/sash.directive.mjs +144 -0
- package/esm2020/sashbox/sashbox-accessor.mjs +6 -0
- package/esm2020/sashbox/sashbox.component.mjs +278 -0
- package/esm2020/sashbox/sashbox.module.mjs +71 -0
- package/esm2020/sashbox/scion-components-sashbox.mjs +5 -0
- package/esm2020/scion-components.mjs +5 -0
- package/esm2020/splitter/public_api.mjs +17 -0
- package/esm2020/splitter/scion-components-splitter.mjs +5 -0
- package/esm2020/splitter/splitter.component.mjs +227 -0
- package/esm2020/splitter/splitter.module.mjs +44 -0
- package/esm2020/throbber/ellipsis-throbber/ellipsis-throbber.component.mjs +25 -0
- package/esm2020/throbber/public_api.mjs +17 -0
- package/esm2020/throbber/ripple-throbber/ripple-throbber.component.mjs +25 -0
- package/esm2020/throbber/roller-throbber/roller-throbber.component.mjs +25 -0
- package/esm2020/throbber/scion-components-throbber.mjs +5 -0
- package/esm2020/throbber/spinner-throbber/spinner-throbber.component.mjs +26 -0
- package/esm2020/throbber/throbber.component.mjs +67 -0
- package/esm2020/throbber/throbber.module.mjs +50 -0
- package/esm2020/viewport/native-scrollbar-track-size-provider.service.mjs +114 -0
- package/esm2020/viewport/public_api.mjs +20 -0
- package/esm2020/viewport/scion-components-viewport.mjs +5 -0
- package/esm2020/viewport/scrollable.directive.mjs +93 -0
- package/esm2020/viewport/scrollbar/scrollbar.component.mjs +322 -0
- package/esm2020/viewport/viewport.component.mjs +265 -0
- package/esm2020/viewport/viewport.module.mjs +52 -0
- package/fesm2015/scion-components-dimension.mjs +137 -0
- package/fesm2015/scion-components-dimension.mjs.map +1 -0
- package/fesm2015/scion-components-sashbox.mjs +556 -0
- package/fesm2015/scion-components-sashbox.mjs.map +1 -0
- package/fesm2015/scion-components-splitter.mjs +286 -0
- package/fesm2015/scion-components-splitter.mjs.map +1 -0
- package/fesm2015/scion-components-throbber.mjs +216 -0
- package/fesm2015/scion-components-throbber.mjs.map +1 -0
- package/fesm2015/scion-components-viewport.mjs +846 -0
- package/fesm2015/scion-components-viewport.mjs.map +1 -0
- package/fesm2015/scion-components.mjs +4 -0
- package/fesm2015/scion-components.mjs.map +1 -0
- package/fesm2020/scion-components-dimension.mjs +137 -0
- package/fesm2020/scion-components-dimension.mjs.map +1 -0
- package/fesm2020/scion-components-sashbox.mjs +556 -0
- package/fesm2020/scion-components-sashbox.mjs.map +1 -0
- package/fesm2020/scion-components-splitter.mjs +284 -0
- package/fesm2020/scion-components-splitter.mjs.map +1 -0
- package/fesm2020/scion-components-throbber.mjs +216 -0
- package/fesm2020/scion-components-throbber.mjs.map +1 -0
- package/fesm2020/scion-components-viewport.mjs +842 -0
- package/fesm2020/scion-components-viewport.mjs.map +1 -0
- package/fesm2020/scion-components.mjs +14 -0
- package/fesm2020/scion-components.mjs.map +1 -0
- package/package.json +93 -0
- package/public-api.d.ts +4 -0
- package/sashbox/element-ref.directive.d.ts +12 -0
- package/sashbox/package.json +10 -0
- package/sashbox/public_api.d.ts +3 -0
- package/sashbox/sash-initializer.directive.d.ts +14 -0
- package/sashbox/sash.directive.d.ts +60 -0
- package/sashbox/sashbox-accessor.d.ts +10 -0
- package/sashbox/sashbox.component.d.ts +90 -0
- package/sashbox/sashbox.module.d.ts +33 -0
- package/sashbox/scion-components-sashbox.d.ts +5 -0
- package/scion-components.d.ts +5 -0
- package/splitter/package.json +10 -0
- package/splitter/public_api.d.ts +2 -0
- package/splitter/scion-components-splitter.d.ts +5 -0
- package/splitter/splitter.component.d.ts +104 -0
- package/splitter/splitter.module.d.ts +17 -0
- package/throbber/ellipsis-throbber/ellipsis-throbber.component.d.ts +10 -0
- package/throbber/package.json +10 -0
- package/throbber/public_api.d.ts +2 -0
- package/throbber/ripple-throbber/ripple-throbber.component.d.ts +10 -0
- package/throbber/roller-throbber/roller-throbber.component.d.ts +10 -0
- package/throbber/scion-components-throbber.d.ts +5 -0
- package/throbber/spinner-throbber/spinner-throbber.component.d.ts +11 -0
- package/throbber/throbber.component.d.ts +43 -0
- package/throbber/throbber.module.d.ts +15 -0
- package/viewport/_index.scss +1 -0
- package/viewport/_scrollbar.scss +44 -0
- package/viewport/native-scrollbar-track-size-provider.service.d.ts +42 -0
- package/viewport/package.json +10 -0
- package/viewport/public_api.d.ts +5 -0
- package/viewport/scion-components-viewport.d.ts +5 -0
- package/viewport/scrollable.directive.d.ts +39 -0
- package/viewport/scrollbar/scrollbar.component.d.ts +106 -0
- package/viewport/viewport.component.d.ts +160 -0
- package/viewport/viewport.module.d.ts +14 -0
|
@@ -0,0 +1,265 @@
|
|
|
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, HostBinding, HostListener, Input, Output, ViewChild } from '@angular/core';
|
|
11
|
+
import { coerceElement } from '@angular/cdk/coercion';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "./native-scrollbar-track-size-provider.service";
|
|
14
|
+
import * as i2 from "./scrollbar/scrollbar.component";
|
|
15
|
+
import * as i3 from "./scrollable.directive";
|
|
16
|
+
import * as i4 from "@angular/cdk/scrolling";
|
|
17
|
+
import * as i5 from "@angular/common";
|
|
18
|
+
/**
|
|
19
|
+
* Represents a viewport with the `<ng-content>` used as scrollable content. Content is added to a CSS grid layout.
|
|
20
|
+
*
|
|
21
|
+
* The viewport component displays scrollbars when its content overflows. Scrollbars are displayed on top of the content, not next to it.
|
|
22
|
+
* 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.
|
|
23
|
+
* The viewport remains natively scrollable with the native scrollbars shifted out of the viewport's visible area. Consequently, the viewport keeps supporting
|
|
24
|
+
* native scrolling features such as touch gestures, scroll speed acceleration, or scrolling near the viewport edges during drag-and-drop operations.
|
|
25
|
+
*
|
|
26
|
+
* ```html
|
|
27
|
+
* <sci-viewport>
|
|
28
|
+
* your content
|
|
29
|
+
* </sci-viewport>
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* ## Adding the viewport to a layout
|
|
33
|
+
*
|
|
34
|
+
* Typically you would add the viewport component to a flexible layout, filling the remaining space vertically and horizontally, such as a flexbox container
|
|
35
|
+
* with the viewport's `flex` CSS property set to either `flex: auto` or `flex: 1 1 0`.
|
|
36
|
+
*
|
|
37
|
+
* 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
|
|
38
|
+
* a layout constraint. Depending on the layout, different steps may be necessary to prevent the viewport from growing to infinity.
|
|
39
|
+
*
|
|
40
|
+
* - If practical, give the viewport a fixed size or a maximum size.
|
|
41
|
+
* - 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,
|
|
42
|
+
* 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
|
|
43
|
+
* `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
|
|
44
|
+
* the remaining extra space is distributed. If the viewport does not appear after setting this property, check its parent elements' content sizes.
|
|
45
|
+
* 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`.
|
|
46
|
+
* Another approach would be to set the minimum height of all parents to `0`, as follows: `min-height: 0`.
|
|
47
|
+
*
|
|
48
|
+
* For the complete documentation on the flex layout and its features, refer to https://developer.mozilla.org/en-US/docs/Web/CSS/flex.
|
|
49
|
+
*
|
|
50
|
+
*
|
|
51
|
+
* ## Layouting the viewport content
|
|
52
|
+
*
|
|
53
|
+
* `NgContent` is added to a CSS grid container with, by default, a single column, filling remaining space vertically and horizontally.
|
|
54
|
+
*
|
|
55
|
+
* You can override the following CSS variables to control the grid:
|
|
56
|
+
*
|
|
57
|
+
* - sci-viewport-content-grid-template-columns: Defines the columns and their track sizes (by default, single column with track size auto)
|
|
58
|
+
* - sci-viewport-content-grid-template-rows: Defines the rows and their track sizes (by default, single row with track size auto)
|
|
59
|
+
* - sci-viewport-content-grid-auto-columns: Defines the track size of not explicitly declared columns.
|
|
60
|
+
* - sci-viewport-content-grid-auto-rows: Defines the track size of not explicitly declared rows.
|
|
61
|
+
* - sci-viewport-content-grid-gap: Sets the gaps (gutters) between rows and columns.
|
|
62
|
+
*
|
|
63
|
+
* Example of how to control the CSS grid:
|
|
64
|
+
*
|
|
65
|
+
* ```css
|
|
66
|
+
* sci-viewport {
|
|
67
|
+
* --sci-viewport-content-grid-auto-rows: min-content;
|
|
68
|
+
* --sci-viewport-content-grid-gap: .5em; // specifies the row and column gap
|
|
69
|
+
* }
|
|
70
|
+
* ```
|
|
71
|
+
*
|
|
72
|
+
* ## Styling of scrollbars
|
|
73
|
+
*
|
|
74
|
+
* You can override the following CSS variables to control the appearance of the scrollbar:
|
|
75
|
+
*
|
|
76
|
+
* - sci-viewport-scrollbar-color: Sets the color of the scrollbar (by default, uses `rgb(78, 78, 78)`).
|
|
77
|
+
*
|
|
78
|
+
* ```css
|
|
79
|
+
* sci-viewport {
|
|
80
|
+
* --sci-viewport-scrollbar-color: blue;
|
|
81
|
+
* }
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export class SciViewportComponent {
|
|
85
|
+
constructor(host, nativeScrollbarTrackSizeProvider) {
|
|
86
|
+
this.host = host;
|
|
87
|
+
this.nativeScrollbarTrackSizeProvider = nativeScrollbarTrackSizeProvider;
|
|
88
|
+
this._scrollbarStyle = 'on-top';
|
|
89
|
+
this.tabindex = -1; // make the viewport programmatically focusable but do not include it in the tab order
|
|
90
|
+
/**
|
|
91
|
+
* Emits upon a scroll event.
|
|
92
|
+
*
|
|
93
|
+
* You can add [sciDimension] directive to the viewport or viewport client to be notified about layout changes.
|
|
94
|
+
*/
|
|
95
|
+
this.scroll = new EventEmitter(); // eslint-disable-line @angular-eslint/no-output-native
|
|
96
|
+
}
|
|
97
|
+
/** @internal */
|
|
98
|
+
set setViewport(viewport) {
|
|
99
|
+
this._viewport = coerceElement(viewport);
|
|
100
|
+
}
|
|
101
|
+
/** @internal */
|
|
102
|
+
set setViewportClient(viewportClient) {
|
|
103
|
+
this._viewportClient = coerceElement(viewportClient);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Controls whether to use native scrollbars or, which is by default, emulated scrollbars that sit on top of the viewport client.
|
|
107
|
+
* In the latter, the viewport client remains natively scrollable.
|
|
108
|
+
*/
|
|
109
|
+
set scrollbarStyle(scrollbarStyle) {
|
|
110
|
+
this._scrollbarStyle = scrollbarStyle || 'on-top';
|
|
111
|
+
}
|
|
112
|
+
get scrollbarStyle() {
|
|
113
|
+
return this._scrollbarStyle;
|
|
114
|
+
}
|
|
115
|
+
focus() {
|
|
116
|
+
this._viewport && this._viewport.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._viewport.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._viewport.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._viewport.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._viewport.scrollLeft = scrollLeft;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Returns the height of the viewport client.
|
|
155
|
+
*
|
|
156
|
+
* @see Element.scrollHeight
|
|
157
|
+
*/
|
|
158
|
+
get scrollHeight() {
|
|
159
|
+
return this._viewport.scrollHeight;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Returns the width of the viewport client.
|
|
163
|
+
*
|
|
164
|
+
* @see Element.scrollWidth
|
|
165
|
+
*/
|
|
166
|
+
get scrollWidth() {
|
|
167
|
+
return this._viewport.scrollWidth;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Returns the viewport {HTMLElement}.
|
|
171
|
+
*/
|
|
172
|
+
get viewportElement() {
|
|
173
|
+
return this._viewport;
|
|
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
|
+
*/
|
|
187
|
+
isElementInView(element, fit) {
|
|
188
|
+
const elLeft = this.computeOffset(element, 'left');
|
|
189
|
+
const elRight = elLeft + element.offsetWidth;
|
|
190
|
+
const elTop = this.computeOffset(element, 'top');
|
|
191
|
+
const elBottom = elTop + element.offsetHeight;
|
|
192
|
+
const vpLeft = this._viewport.scrollLeft;
|
|
193
|
+
const vpRight = vpLeft + this._viewport.clientWidth;
|
|
194
|
+
const vpTop = this._viewport.scrollTop;
|
|
195
|
+
const vpBottom = vpTop + this._viewport.clientHeight;
|
|
196
|
+
switch (fit) {
|
|
197
|
+
case 'full':
|
|
198
|
+
return (elLeft >= vpLeft && elRight <= vpRight) && (elTop >= vpTop && elBottom <= vpBottom);
|
|
199
|
+
case 'partial':
|
|
200
|
+
return (elRight >= vpLeft && elLeft <= vpRight) && (elBottom >= vpTop && elTop <= vpBottom);
|
|
201
|
+
default:
|
|
202
|
+
throw Error('Unsupported fit strategy');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Scrolls the specified element into the viewport.
|
|
207
|
+
*
|
|
208
|
+
* @param element - the element to scroll into the viewport
|
|
209
|
+
* @param offset - the gap between the element and the viewport
|
|
210
|
+
*/
|
|
211
|
+
scrollIntoView(element, offset = 50) {
|
|
212
|
+
this._viewport.scrollTop = this.computeOffset(element, 'top') - offset;
|
|
213
|
+
this._viewport.scrollLeft = this.computeOffset(element, 'left') - offset;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Computes the distance of the element to the viewport's left or top border.
|
|
217
|
+
*/
|
|
218
|
+
computeOffset(element, border) {
|
|
219
|
+
if (!isChildOf(element, this._viewport)) {
|
|
220
|
+
throw Error('element not a child of the viewport');
|
|
221
|
+
}
|
|
222
|
+
let offset = 0;
|
|
223
|
+
let el = element;
|
|
224
|
+
do {
|
|
225
|
+
offset += (border === 'left' ? el.offsetLeft : el.offsetTop);
|
|
226
|
+
el = el.offsetParent;
|
|
227
|
+
} while (el !== null && el !== this._viewport);
|
|
228
|
+
return offset;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
SciViewportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciViewportComponent, deps: [{ token: i0.ElementRef }, { token: i1.SciNativeScrollbarTrackSizeProvider }], target: i0.ɵɵFactoryTarget.Component });
|
|
232
|
+
SciViewportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.3", type: SciViewportComponent, selector: "sci-viewport", inputs: { scrollbarStyle: "scrollbarStyle" }, outputs: { scroll: "scroll" }, host: { listeners: { "focus": "focus()" }, properties: { "attr.tabindex": "this.tabindex" } }, 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\">\n <ng-content></ng-content>\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\"></sci-scrollbar>\n <sci-scrollbar [direction]=\"'hscroll'\" [viewport]=\"viewport\"></sci-scrollbar>\n</ng-container>\n", styles: [":host{--sci-viewport-content-grid-template-columns: auto;--sci-viewport-content-grid-template-rows: unset;--sci-viewport-content-grid-auto-columns: unset;--sci-viewport-content-grid-auto-rows: auto;--sci-viewport-content-grid-gap: 0 0;--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: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;grid-template-columns:var(--sci-viewport-content-grid-template-columns);grid-template-rows:var(--sci-viewport-content-grid-template-rows);grid-auto-rows:var(--sci-viewport-content-grid-auto-rows);grid-auto-columns:var(--sci-viewport-content-grid-auto-columns);grid-gap:var(--sci-viewport-content-grid-gap);gap:var(--sci-viewport-content-grid-gap)}: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"], components: [{ type: i2.SciScrollbarComponent, selector: "sci-scrollbar", inputs: ["direction", "viewport"] }], directives: [{ type: i3.SciScrollableDirective, selector: "[sciScrollable]", inputs: ["sciScrollableDisplayNativeScrollbar"] }, { type: i4.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i5.AsyncPipe } });
|
|
233
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciViewportComponent, decorators: [{
|
|
234
|
+
type: Component,
|
|
235
|
+
args: [{ selector: 'sci-viewport', 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\">\n <ng-content></ng-content>\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\"></sci-scrollbar>\n <sci-scrollbar [direction]=\"'hscroll'\" [viewport]=\"viewport\"></sci-scrollbar>\n</ng-container>\n", styles: [":host{--sci-viewport-content-grid-template-columns: auto;--sci-viewport-content-grid-template-rows: unset;--sci-viewport-content-grid-auto-columns: unset;--sci-viewport-content-grid-auto-rows: auto;--sci-viewport-content-grid-gap: 0 0;--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: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;grid-template-columns:var(--sci-viewport-content-grid-template-columns);grid-template-rows:var(--sci-viewport-content-grid-template-rows);grid-auto-rows:var(--sci-viewport-content-grid-auto-rows);grid-auto-columns:var(--sci-viewport-content-grid-auto-columns);grid-gap:var(--sci-viewport-content-grid-gap);gap:var(--sci-viewport-content-grid-gap)}: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"] }]
|
|
236
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.SciNativeScrollbarTrackSizeProvider }]; }, propDecorators: { tabindex: [{
|
|
237
|
+
type: HostBinding,
|
|
238
|
+
args: ['attr.tabindex']
|
|
239
|
+
}], setViewport: [{
|
|
240
|
+
type: ViewChild,
|
|
241
|
+
args: ['viewport', { static: true }]
|
|
242
|
+
}], setViewportClient: [{
|
|
243
|
+
type: ViewChild,
|
|
244
|
+
args: ['viewport_client', { static: true }]
|
|
245
|
+
}], scrollbarStyle: [{
|
|
246
|
+
type: Input
|
|
247
|
+
}], scroll: [{
|
|
248
|
+
type: Output
|
|
249
|
+
}], focus: [{
|
|
250
|
+
type: HostListener,
|
|
251
|
+
args: ['focus']
|
|
252
|
+
}] } });
|
|
253
|
+
/**
|
|
254
|
+
* Returns 'true' if the given element is a child element of the parent element.
|
|
255
|
+
*/
|
|
256
|
+
function isChildOf(element, parent) {
|
|
257
|
+
while (element.parentElement !== null) {
|
|
258
|
+
element = element.parentElement;
|
|
259
|
+
if (element === parent) {
|
|
260
|
+
return true;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld3BvcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vY29tcG9uZW50cy92aWV3cG9ydC9zcmMvdmlld3BvcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vY29tcG9uZW50cy92aWV3cG9ydC9zcmMvdmlld3BvcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXZILE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQzs7Ozs7OztBQUVwRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpRUc7QUFNSCxNQUFNLE9BQU8sb0JBQW9CO0lBMEMvQixZQUFtQixJQUE2QixFQUFTLGdDQUFxRTtRQUEzRyxTQUFJLEdBQUosSUFBSSxDQUF5QjtRQUFTLHFDQUFnQyxHQUFoQyxnQ0FBZ0MsQ0FBcUM7UUF0Q3RILG9CQUFlLEdBQW1CLFFBQVEsQ0FBQztRQUc1QyxhQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzRkFBc0Y7UUEyQjVHOzs7O1dBSUc7UUFFSSxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQyxDQUFDLHVEQUF1RDtJQUdsRyxDQUFDO0lBbENELGdCQUFnQjtJQUNoQixJQUNXLFdBQVcsQ0FBQyxRQUFvQztRQUN6RCxJQUFJLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsZ0JBQWdCO0lBQ2hCLElBQ1csaUJBQWlCLENBQUMsY0FBMEM7UUFDckUs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QUMsVUFBVSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFPMUIsaUJBQWlCO3NCQUQzQixTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFVakMsY0FBYztzQkFEeEIsS0FBSztnQkFlQyxNQUFNO3NCQURaLE1BQU07Z0JBT0EsS0FBSztzQkFEWCxZQUFZO3VCQUFDLE9BQU87O0FBc0l2Qjs7R0FFRztBQUNILFNBQVMsU0FBUyxDQUFDLE9BQWdCLEVBQUUsTUFBZTtJQUNsRCxPQUFPLE9BQU8sQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO1FBQ3JDLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBQ2hDLElBQUksT0FBTyxLQUFLLE1BQU0sRUFBRTtZQUN0QixPQUFPLElBQUksQ0FBQztTQUNiO0tBQ0Y7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0NvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0QmluZGluZywgSG9zdExpc3RlbmVyLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTY2lOYXRpdmVTY3JvbGxiYXJUcmFja1NpemVQcm92aWRlcn0gZnJvbSAnLi9uYXRpdmUtc2Nyb2xsYmFyLXRyYWNrLXNpemUtcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQge2NvZXJjZUVsZW1lbnR9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHZpZXdwb3J0IHdpdGggdGhlIGA8bmctY29udGVudD5gIHVzZWQgYXMgc2Nyb2xsYWJsZSBjb250ZW50LiBDb250ZW50IGlzIGFkZGVkIHRvIGEgQ1NTIGdyaWQgbGF5b3V0LlxuICpcbiAqIFRoZSB2aWV3cG9ydCBjb21wb25lbnQgZGlzcGxheXMgc2Nyb2xsYmFycyB3aGVuIGl0cyBjb250ZW50IG92ZXJmbG93cy4gU2Nyb2xsYmFycyBhcmUgZGlzcGxheWVkIG9uIHRvcCBvZiB0aGUgY29udGVudCwgbm90IG5leHQgdG8gaXQuXG4gKiBUaGUgY29tcG9uZW50IHVzZXMgdGhlIG5hdGl2ZSBzY3JvbGxiYXJzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGlmIHRoZXkgYXJlIGFscmVhZHkgc2l0dGluZyBvbiB0b3AsIG9yIGZhbGxzIGJhY2sgYW5kIHJlbmRlcnMgc2Nyb2xsYmFycyBvbiB0b3Agb3RoZXJ3aXNlLlxuICogVGhlIHZpZXdwb3J0IHJlbWFpbnMgbmF0aXZlbHkgc2Nyb2xsYWJsZSB3aXRoIHRoZSBuYXRpdmUgc2Nyb2xsYmFycyBzaGlmdGVkIG91dCBvZiB0aGUgdmlld3BvcnQncyB2aXNpYmxlIGFyZWEuIENvbnNlcXVlbnRseSwgdGhlIHZpZXdwb3J0IGtlZXBzIHN1cHBvcnRpbmdcbiAqIG5hdGl2ZSBzY3JvbGxpbmcgZmVhdHVyZXMgc3VjaCBhcyB0b3VjaCBnZXN0dXJlcywgc2Nyb2xsIHNwZWVkIGFjY2VsZXJhdGlvbiwgb3Igc2Nyb2xsaW5nIG5lYXIgdGhlIHZpZXdwb3J0IGVkZ2VzIGR1cmluZyBkcmFnLWFuZC1kcm9wIG9wZXJhdGlvbnMuXG4gKlxuICogYGBgaHRtbFxuICogPHNjaS12aWV3cG9ydD5cbiAqICAgeW91ciBjb250ZW50XG4gKiA8L3NjaS12aWV3cG9ydD5cbiAqIGBgYFxuICpcbiAqICMjIEFkZGluZyB0aGUgdmlld3BvcnQgdG8gYSBsYXlvdXRcbiAqXG4gKiBUeXBpY2FsbHkgeW91IHdvdWxkIGFkZCB0aGUgdmlld3BvcnQgY29tcG9uZW50IHRvIGEgZmxleGlibGUgbGF5b3V0LCBmaWxsaW5nIHRoZSByZW1haW5pbmcgc3BhY2UgdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5LCBzdWNoIGFzIGEgZmxleGJveCBjb250YWluZXJcbiAqIHdpdGggdGhlIHZpZXdwb3J0J3MgYGZsZXhgIENTUyBwcm9wZXJ0eSBzZXQgdG8gZWl0aGVyIGBmbGV4OiBhdXRvYCBvciBgZmxleDogMSAxIDBgLlxuICpcbiAqIFRoZSB2aWV3cG9ydCBpcyBzaXplZCBhY2NvcmRpbmcgdG8gaXRzIGNvbnRlbnQgd2lkdGggYW5kIGhlaWdodC4gSXQgZ3Jvd3MgdG8gYWJzb3JiIGFueSBmcmVlIHNwYWNlLCB0aHVzIG92ZXJmbG93aW5nIGl0cyBjb250ZW50IG9ubHkgd2hlbiBlbmNvdW50ZXJpbmdcbiAqIGEgbGF5b3V0IGNvbnN0cmFpbnQuIERlcGVuZGluZyBvbiB0aGUgbGF5b3V0LCBkaWZmZXJlbnQgc3RlcHMgbWF5IGJlIG5lY2Vzc2FyeSB0byBwcmV2ZW50IHRoZSB2aWV3cG9ydCBmcm9tIGdyb3dpbmcgdG8gaW5maW5pdHkuXG4gKlxuICogLSBJZiBwcmFjdGljYWwsIGdpdmUgdGhlIHZpZXdwb3J0IGEgZml4ZWQgc2l6ZSBvciBhIG1heGltdW0gc2l6ZS5cbiAqIC0gSWYgeW91IGFkZCB0aGUgdmlld3BvcnQgdG8gYSBmbGV4Ym94IGxheW91dCwgbWFrZSBzdXJlIHRoYXQgaXQgY2Fubm90IGV4Y2VlZCB0aGUgYXZhaWxhYmxlIHNwYWNlLiBJbnN0ZWFkLCB0aGUgdmlld3BvcnQgc2hvdWxkIGZpbGwgdGhlIHJlbWFpbmluZyBzcGFjZSxcbiAqICAgdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5LiBCZSBhd2FyZSB0aGF0LCBieSBkZWZhdWx0LCBhIGZsZXggaXRlbSBkb2VzIG5vdCBzaHJpbmsgYmVsb3cgaXRzIG1pbmltdW0gY29udGVudCBzaXplLiBUbyBjaGFuZ2UgdGhpcywgc2V0IHRoZSB2aWV3cG9ydCdzXG4gKiAgIGBmbGV4LWJhc2lzYCB0byBgMGAgKGluc3RlYWQgb2YgYGF1dG9gKSwgb3IgdXNlIHRoZSBDU1Mgc2hvcnRoYW5kIHByb3BlcnR5IGBmbGV4OiAxIDEgMGAuIFRoZSBgZmxleC1iYXNpc2AgZGVmaW5lcyB0aGUgZGVmYXVsdCBzaXplIG9mIGEgZmxleCBpdGVtIGJlZm9yZVxuICogICB0aGUgcmVtYWluaW5nIGV4dHJhIHNwYWNlIGlzIGRpc3RyaWJ1dGVkLiBJZiB0aGUgdmlld3BvcnQgZG9lcyBub3QgYXBwZWFyIGFmdGVyIHNldHRpbmcgdGhpcyBwcm9wZXJ0eSwgY2hlY2sgaXRzIHBhcmVudCBlbGVtZW50cycgY29udGVudCBzaXplcy5cbiAqICAgQXMgYW4gYWx0ZXJuYXRpdmUgdG8gc2V0dGluZyBgZmxleDogMSAxIDBgLCBjaGFuZ2UgdGhlIHNldHRpbmcgdG8gYGZsZXg6IGF1dG9gIGFuZCBoaWRlIHRoZSBvdmVyZmxvdyBpbiB0aGUgcGFyZW50IGVsZW1lbnQsIGFzIGZvbGxvd3M6IGBvdmVyZmxvdzogaGlkZGVuYC5cbiAqICAgQW5vdGhlciBhcHByb2FjaCB3b3VsZCBiZSB0byBzZXQgdGhlIG1pbmltdW0gaGVpZ2h0IG9mIGFsbCBwYXJlbnRzIHRvIGAwYCwgYXMgZm9sbG93czogYG1pbi1oZWlnaHQ6IDBgLlxuICpcbiAqICAgRm9yIHRoZSBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIG9uIHRoZSBmbGV4IGxheW91dCBhbmQgaXRzIGZlYXR1cmVzLCByZWZlciB0byBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvZmxleC5cbiAqXG4gKlxuICogIyMgTGF5b3V0aW5nIHRoZSB2aWV3cG9ydCBjb250ZW50XG4gKlxuICogYE5nQ29udGVudGAgaXMgYWRkZWQgdG8gYSBDU1MgZ3JpZCBjb250YWluZXIgd2l0aCwgYnkgZGVmYXVsdCwgYSBzaW5nbGUgY29sdW1uLCBmaWxsaW5nIHJlbWFpbmluZyBzcGFjZSB2ZXJ0aWNhbGx5IGFuZCBob3Jpem9udGFsbHkuXG4gKlxuICogWW91IGNhbiBvdmVycmlkZSB0aGUgZm9sbG93aW5nIENTUyB2YXJpYWJsZXMgdG8gY29udHJvbCB0aGUgZ3JpZDpcbiAqXG4gKiAtIHNjaS12aWV3cG9ydC1jb250ZW50LWdyaWQtdGVtcGxhdGUtY29sdW1uczogICBEZWZpbmVzIHRoZSBjb2x1bW5zIGFuZCB0aGVpciB0cmFjayBzaXplcyAoYnkgZGVmYXVsdCwgc2luZ2xlIGNvbHVtbiB3aXRoIHRyYWNrIHNpemUgYXV0bylcbiAqIC0gc2NpLXZpZXdwb3J0LWNvbnRlbnQtZ3JpZC10ZW1wbGF0ZS1yb3dzOiAgICAgIERlZmluZXMgdGhlIHJvd3MgYW5kIHRoZWlyIHRyYWNrIHNpemVzIChieSBkZWZhdWx0LCBzaW5nbGUgcm93IHdpdGggdHJhY2sgc2l6ZSBhdXRvKVxuICogLSBzY2ktdmlld3BvcnQtY29udGVudC1ncmlkLWF1dG8tY29sdW1uczogICAgICAgRGVmaW5lcyB0aGUgdHJhY2sgc2l6ZSBvZiBub3QgZXhwbGljaXRseSBkZWNsYXJlZCBjb2x1bW5zLlxuICogLSBzY2ktdmlld3BvcnQtY29udGVudC1ncmlkLWF1dG8tcm93czogICAgICAgICAgRGVmaW5lcyB0aGUgdHJhY2sgc2l6ZSBvZiBub3QgZXhwbGljaXRseSBkZWNsYXJlZCByb3dzLlxuICogLSBzY2ktdmlld3BvcnQtY29udGVudC1ncmlkLWdhcDogICAgICAgICAgICAgICAgU2V0cyB0aGUgZ2FwcyAoZ3V0dGVycykgYmV0d2VlbiByb3dzIGFuZCBjb2x1bW5zLlxuICpcbiAqIEV4YW1wbGUgb2YgaG93IHRvIGNvbnRyb2wgdGhlIENTUyBncmlkOlxuICpcbiAqIGBgYGNzc1xuICogc2NpLXZpZXdwb3J0IHtcbiAqICAgLS1zY2ktdmlld3BvcnQtY29udGVudC1ncmlkLWF1dG8tcm93czogbWluLWNvbnRlbnQ7XG4gKiAgIC0tc2NpLXZpZXdwb3J0LWNvbnRlbnQtZ3JpZC1nYXA6IC41ZW07IC8vIHNwZWNpZmllcyB0aGUgcm93IGFuZCBjb2x1bW4gZ2FwXG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBTdHlsaW5nIG9mIHNjcm9sbGJhcnNcbiAqXG4gKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgQ1NTIHZhcmlhYmxlcyB0byBjb250cm9sIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzY3JvbGxiYXI6XG4gKlxuICogLSBzY2ktdmlld3BvcnQtc2Nyb2xsYmFyLWNvbG9yOiAgICAgU2V0cyB0aGUgY29sb3Igb2YgdGhlIHNjcm9sbGJhciAoYnkgZGVmYXVsdCwgdXNlcyBgcmdiKDc4LCA3OCwgNzgpYCkuXG4gKlxuICogYGBgY3NzXG4gKiBzY2ktdmlld3BvcnQge1xuICogICAtLXNjaS12aWV3cG9ydC1zY3JvbGxiYXItY29sb3I6IGJsdWU7XG4gKiB9XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2NpLXZpZXdwb3J0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZpZXdwb3J0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdmlld3BvcnQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgU2NpVmlld3BvcnRDb21wb25lbnQge1xuXG4gIHByaXZhdGUgX3ZpZXdwb3J0ITogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgX3ZpZXdwb3J0Q2xpZW50ITogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgX3Njcm9sbGJhclN0eWxlOiBTY3JvbGxiYXJTdHlsZSA9ICdvbi10b3AnO1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gIHB1YmxpYyB0YWJpbmRleCA9IC0xOyAvLyBtYWtlIHRoZSB2aWV3cG9ydCBwcm9ncmFtbWF0aWNhbGx5IGZvY3VzYWJsZSBidXQgZG8gbm90IGluY2x1ZGUgaXQgaW4gdGhlIHRhYiBvcmRlclxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgQFZpZXdDaGlsZCgndmlld3BvcnQnLCB7c3RhdGljOiB0cnVlfSlcbiAgcHVibGljIHNldCBzZXRWaWV3cG9ydCh2aWV3cG9ydDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4pIHtcbiAgICB0aGlzLl92aWV3cG9ydCA9IGNvZXJjZUVsZW1lbnQodmlld3BvcnQpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBAVmlld0NoaWxkKCd2aWV3cG9ydF9jbGllbnQnLCB7c3RhdGljOiB0cnVlfSlcbiAgcHVibGljIHNldCBzZXRWaWV3cG9ydENsaWVudCh2aWV3cG9ydENsaWVudDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4pIHtcbiAgICB0aGlzLl92aWV3cG9ydENsaWVudCA9IGNvZXJjZUVsZW1lbnQodmlld3BvcnRDbGllbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgdG8gdXNlIG5hdGl2ZSBzY3JvbGxiYXJzIG9yLCB3aGljaCBpcyBieSBkZWZhdWx0LCBlbXVsYXRlZCBzY3JvbGxiYXJzIHRoYXQgc2l0IG9uIHRvcCBvZiB0aGUgdmlld3BvcnQgY2xpZW50LlxuICAgKiBJbiB0aGUgbGF0dGVyLCB0aGUgdmlld3BvcnQgY2xpZW50IHJlbWFpbnMgbmF0aXZlbHkgc2Nyb2xsYWJsZS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2Nyb2xsYmFyU3R5bGUoc2Nyb2xsYmFyU3R5bGU6IFNjcm9sbGJhclN0eWxlKSB7XG4gICAgdGhpcy5fc2Nyb2xsYmFyU3R5bGUgPSBzY3JvbGxiYXJTdHlsZSB8fCAnb24tdG9wJztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2Nyb2xsYmFyU3R5bGUoKTogU2Nyb2xsYmFyU3R5bGUge1xuICAgIHJldHVybiB0aGlzLl9zY3JvbGxiYXJTdHlsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB1cG9uIGEgc2Nyb2xsIGV2ZW50LlxuICAgKlxuICAgKiBZb3UgY2FuIGFkZCBbc2NpRGltZW5zaW9uXSBkaXJlY3RpdmUgdG8gdGhlIHZpZXdwb3J0IG9yIHZpZXdwb3J0IGNsaWVudCB0byBiZSBub3RpZmllZCBhYm91dCBsYXlvdXQgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW5hdGl2ZVxuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiwgcHVibGljIG5hdGl2ZVNjcm9sbGJhclRyYWNrU2l6ZVByb3ZpZGVyOiBTY2lOYXRpdmVTY3JvbGxiYXJUcmFja1NpemVQcm92aWRlcikge1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZm9jdXMnKVxuICBwdWJsaWMgZm9jdXMoKTogdm9pZCB7IC8vIGRvIG5vdCByZW5hbWUgdG8gZXhwb3NlIHRoZSBzYW1lIGZvY3VzIG1ldGhvZCBsaWtlIGBIVE1MRWxlbWVudC5mb2N1cygpYC5cbiAgICB0aGlzLl92aWV3cG9ydCAmJiB0aGlzLl92aWV3cG9ydC5mb2N1cygpO1xuICB9XG5cbiAgcHVibGljIG9uU2Nyb2xsKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2Nyb2xsLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUgdmlld3BvcnQgY2xpZW50IGlzIHNjcm9sbGVkIHZlcnRpY2FsbHkuXG4gICAqXG4gICAqIEBzZWUgRWxlbWVudC5zY3JvbGxUb3BcbiAgICovXG4gIHB1YmxpYyBnZXQgc2Nyb2xsVG9wKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0LnNjcm9sbFRvcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgdGhlIHZpZXdwb3J0IGNsaWVudCBpcyBzY3JvbGxlZCB2ZXJ0aWNhbGx5LlxuICAgKlxuICAgKiBAc2VlIEVsZW1lbnQuc2Nyb2xsVG9wXG4gICAqL1xuICBwdWJsaWMgc2V0IHNjcm9sbFRvcChzY3JvbGxUb3A6IG51bWJlcikge1xuICAgIHRoaXMuX3ZpZXdwb3J0LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgdGhlIHZpZXdwb3J0IGNsaWVudCBpcyBzY3JvbGxlZCBob3Jpem9udGFsbHkuXG4gICAqXG4gICAqIEBzZWUgRWxlbWVudC5zY3JvbGxMZWZ0XG4gICAqL1xuICBwdWJsaWMgZ2V0IHNjcm9sbExlZnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld3BvcnQuc2Nyb2xsTGVmdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgdGhlIHZpZXdwb3J0IGNsaWVudCBpcyBzY3JvbGxlZCBob3Jpem9udGFsbHkuXG4gICAqXG4gICAqIEBzZWUgRWxlbWVudC5zY3JvbGxMZWZ0XG4gICAqL1xuICBwdWJsaWMgc2V0IHNjcm9sbExlZnQoc2Nyb2xsTGVmdDogbnVtYmVyKSB7XG4gICAgdGhpcy5fdmlld3BvcnQuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCBjbGllbnQuXG4gICAqXG4gICAqIEBzZWUgRWxlbWVudC5zY3JvbGxIZWlnaHRcbiAgICovXG4gIHB1YmxpYyBnZXQgc2Nyb2xsSGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0LnNjcm9sbEhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgdmlld3BvcnQgY2xpZW50LlxuICAgKlxuICAgKiBAc2VlIEVsZW1lbnQuc2Nyb2xsV2lkdGhcbiAgICovXG4gIHB1YmxpYyBnZXQgc2Nyb2xsV2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdmlld3BvcnQuc2Nyb2xsV2lkdGg7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmlld3BvcnQge0hUTUxFbGVtZW50fS5cbiAgICovXG4gIHB1YmxpYyBnZXQgdmlld3BvcnRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5fdmlld3BvcnQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmlld3BvcnQgY2xpZW50IHtIVE1MRWxlbWVudH0uXG4gICAqL1xuICBwdWJsaWMgZ2V0IHZpZXdwb3J0Q2xpZW50RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgc2Nyb2xsZWQgaW50byB0aGUgdmlld3BvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gdGhlIGVsZW1lbnQgdG8gYmUgY2hlY2tlZFxuICAgKiBAcGFyYW0gZml0IC0gY29udHJvbCBpZiB0aGUgZWxlbWVudCBtdXN0IGZ1bGx5IG9yIHBhcnRpYWxseSBmaXQgaW50byB0aGUgdmlld3BvcnRcbiAgICovXG4gIHB1YmxpYyBpc0VsZW1lbnRJblZpZXcoZWxlbWVudDogSFRNTEVsZW1lbnQsIGZpdDogJ2Z1bGwnIHwgJ3BhcnRpYWwnKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZWxMZWZ0ID0gdGhpcy5jb21wdXRlT2Zmc2V0KGVsZW1lbnQsICdsZWZ0Jyk7XG4gICAgY29uc3QgZWxSaWdodCA9IGVsTGVmdCArIGVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgY29uc3QgZWxUb3AgPSB0aGlzLmNvbXB1dGVPZmZzZXQoZWxlbWVudCwgJ3RvcCcpO1xuICAgIGNvbnN0IGVsQm90dG9tID0gZWxUb3AgKyBlbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICAgIGNvbnN0IHZwTGVmdCA9IHRoaXMuX3ZpZXdwb3J0LnNjcm9sbExlZnQ7XG4gICAgY29uc3QgdnBSaWdodCA9IHZwTGVmdCArIHRoaXMuX3ZpZXdwb3J0LmNsaWVudFdpZHRoO1xuICAgIGNvbnN0IHZwVG9wID0gdGhpcy5fdmlld3BvcnQuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHZwQm90dG9tID0gdnBUb3AgKyB0aGlzLl92aWV3cG9ydC5jbGllbnRIZWlnaHQ7XG5cbiAgICBzd2l0Y2ggKGZpdCkge1xuICAgICAgY2FzZSAnZnVsbCc6XG4gICAgICAgIHJldHVybiAoZWxMZWZ0ID49IHZwTGVmdCAmJiBlbFJpZ2h0IDw9IHZwUmlnaHQpICYmIChlbFRvcCA+PSB2cFRvcCAmJiBlbEJvdHRvbSA8PSB2cEJvdHRvbSk7XG4gICAgICBjYXNlICdwYXJ0aWFsJzpcbiAgICAgICAgcmV0dXJuIChlbFJpZ2h0ID49IHZwTGVmdCAmJiBlbExlZnQgPD0gdnBSaWdodCkgJiYgKGVsQm90dG9tID49IHZwVG9wICYmIGVsVG9wIDw9IHZwQm90dG9tKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IEVycm9yKCdVbnN1cHBvcnRlZCBmaXQgc3RyYXRlZ3knKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW50byB0aGUgdmlld3BvcnQuXG4gICAqXG4gICAqIEBwYXJhbSBlbGVtZW50IC0gdGhlIGVsZW1lbnQgdG8gc2Nyb2xsIGludG8gdGhlIHZpZXdwb3J0XG4gICAqIEBwYXJhbSBvZmZzZXQgLSB0aGUgZ2FwIGJldHdlZW4gdGhlIGVsZW1lbnQgYW5kIHRoZSB2aWV3cG9ydFxuICAgKi9cbiAgcHVibGljIHNjcm9sbEludG9WaWV3KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvZmZzZXQ6IG51bWJlciA9IDUwKTogdm9pZCB7XG4gICAgdGhpcy5fdmlld3BvcnQuc2Nyb2xsVG9wID0gdGhpcy5jb21wdXRlT2Zmc2V0KGVsZW1lbnQsICd0b3AnKSAtIG9mZnNldDtcbiAgICB0aGlzLl92aWV3cG9ydC5zY3JvbGxMZWZ0ID0gdGhpcy5jb21wdXRlT2Zmc2V0KGVsZW1lbnQsICdsZWZ0JykgLSBvZmZzZXQ7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIGRpc3RhbmNlIG9mIHRoZSBlbGVtZW50IHRvIHRoZSB2aWV3cG9ydCdzIGxlZnQgb3IgdG9wIGJvcmRlci5cbiAgICovXG4gIHB1YmxpYyBjb21wdXRlT2Zmc2V0KGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBib3JkZXI6ICdsZWZ0JyB8ICd0b3AnKTogbnVtYmVyIHtcbiAgICBpZiAoIWlzQ2hpbGRPZihlbGVtZW50LCB0aGlzLl92aWV3cG9ydCkpIHtcbiAgICAgIHRocm93IEVycm9yKCdlbGVtZW50IG5vdCBhIGNoaWxkIG9mIHRoZSB2aWV3cG9ydCcpO1xuICAgIH1cblxuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGxldCBlbCA9IGVsZW1lbnQ7XG4gICAgZG8ge1xuICAgICAgb2Zmc2V0ICs9IChib3JkZXIgPT09ICdsZWZ0JyA/IGVsLm9mZnNldExlZnQgOiBlbC5vZmZzZXRUb3ApO1xuICAgICAgZWwgPSBlbC5vZmZzZXRQYXJlbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgfSB3aGlsZSAoZWwgIT09IG51bGwgJiYgZWwgIT09IHRoaXMuX3ZpZXdwb3J0KTtcblxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zICd0cnVlJyBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBhIGNoaWxkIGVsZW1lbnQgb2YgdGhlIHBhcmVudCBlbGVtZW50LlxuICovXG5mdW5jdGlvbiBpc0NoaWxkT2YoZWxlbWVudDogRWxlbWVudCwgcGFyZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgIT09IG51bGwpIHtcbiAgICBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIGlmIChlbGVtZW50ID09PSBwYXJlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHNjcm9sbGJhciBzdHlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgU2Nyb2xsYmFyU3R5bGUgPSAnbmF0aXZlJyB8ICdvbi10b3AnIHwgJ2hpZGRlbic7XG4iLCI8IS0tIHZpZXdwb3J0IGFuZCB2aWV3cG9ydCBjbGllbnQgLS0+XG48ZGl2ICN2aWV3cG9ydFxuICAgICBjbGFzcz1cInZpZXdwb3J0XCJcbiAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgIHNjaVNjcm9sbGFibGUgW3NjaVNjcm9sbGFibGVEaXNwbGF5TmF0aXZlU2Nyb2xsYmFyXT1cInNjcm9sbGJhclN0eWxlID09PSAnbmF0aXZlJ1wiXG4gICAgIGNka1Njcm9sbGFibGVcbiAgICAgKHNjcm9sbCk9XCJvblNjcm9sbCgkZXZlbnQpXCI+XG4gIDxkaXYgI3ZpZXdwb3J0X2NsaWVudCBjbGFzcz1cInZpZXdwb3J0LWNsaWVudFwiPlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSByZW5kZXIgZW11bGF0ZWQgc2Nyb2xsYmFycyB3aGljaCBzaXQgb24tdG9wIC0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInNjcm9sbGJhclN0eWxlID09PSAnb24tdG9wJyAmJiAobmF0aXZlU2Nyb2xsYmFyVHJhY2tTaXplUHJvdmlkZXIudHJhY2tTaXplJCB8IGFzeW5jKSAhPT0gbnVsbFwiPlxuICA8c2NpLXNjcm9sbGJhciBbZGlyZWN0aW9uXT1cIid2c2Nyb2xsJ1wiIFt2aWV3cG9ydF09XCJ2aWV3cG9ydFwiPjwvc2NpLXNjcm9sbGJhcj5cbiAgPHNjaS1zY3JvbGxiYXIgW2RpcmVjdGlvbl09XCInaHNjcm9sbCdcIiBbdmlld3BvcnRdPVwidmlld3BvcnRcIj48L3NjaS1zY3JvbGxiYXI+XG48L25nLWNvbnRhaW5lcj5cbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
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 { CommonModule } from '@angular/common';
|
|
12
|
+
import { SciViewportComponent } from './viewport.component';
|
|
13
|
+
import { SciScrollbarComponent } from './scrollbar/scrollbar.component';
|
|
14
|
+
import { SciScrollableDirective } from './scrollable.directive';
|
|
15
|
+
import { ScrollingModule } from '@angular/cdk/scrolling';
|
|
16
|
+
import * as i0 from "@angular/core";
|
|
17
|
+
/**
|
|
18
|
+
* Provides a viewport component with scrollbars that sit on top of the viewport client.
|
|
19
|
+
*/
|
|
20
|
+
export class SciViewportModule {
|
|
21
|
+
}
|
|
22
|
+
SciViewportModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciViewportModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
23
|
+
SciViewportModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciViewportModule, declarations: [SciViewportComponent,
|
|
24
|
+
SciScrollbarComponent,
|
|
25
|
+
SciScrollableDirective], imports: [CommonModule,
|
|
26
|
+
ScrollingModule], exports: [SciViewportComponent,
|
|
27
|
+
SciScrollbarComponent,
|
|
28
|
+
SciScrollableDirective] });
|
|
29
|
+
SciViewportModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciViewportModule, imports: [[
|
|
30
|
+
CommonModule,
|
|
31
|
+
ScrollingModule,
|
|
32
|
+
]] });
|
|
33
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciViewportModule, decorators: [{
|
|
34
|
+
type: NgModule,
|
|
35
|
+
args: [{
|
|
36
|
+
imports: [
|
|
37
|
+
CommonModule,
|
|
38
|
+
ScrollingModule,
|
|
39
|
+
],
|
|
40
|
+
declarations: [
|
|
41
|
+
SciViewportComponent,
|
|
42
|
+
SciScrollbarComponent,
|
|
43
|
+
SciScrollableDirective,
|
|
44
|
+
],
|
|
45
|
+
exports: [
|
|
46
|
+
SciViewportComponent,
|
|
47
|
+
SciScrollbarComponent,
|
|
48
|
+
SciScrollableDirective,
|
|
49
|
+
],
|
|
50
|
+
}]
|
|
51
|
+
}] });
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld3BvcnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vY29tcG9uZW50cy92aWV3cG9ydC9zcmMvdmlld3BvcnQubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDMUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDdEUsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHdCQUF3QixDQUFDOztBQUV2RDs7R0FFRztBQWlCSCxNQUFNLE9BQU8saUJBQWlCOzs4R0FBakIsaUJBQWlCOytHQUFqQixpQkFBaUIsaUJBVjFCLG9CQUFvQjtRQUNwQixxQkFBcUI7UUFDckIsc0JBQXNCLGFBTnRCLFlBQVk7UUFDWixlQUFlLGFBUWYsb0JBQW9CO1FBQ3BCLHFCQUFxQjtRQUNyQixzQkFBc0I7K0dBR2IsaUJBQWlCLFlBZm5CO1lBQ1AsWUFBWTtZQUNaLGVBQWU7U0FDaEI7MkZBWVUsaUJBQWlCO2tCQWhCN0IsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUU7d0JBQ1AsWUFBWTt3QkFDWixlQUFlO3FCQUNoQjtvQkFDRCxZQUFZLEVBQUU7d0JBQ1osb0JBQW9CO3dCQUNwQixxQkFBcUI7d0JBQ3JCLHNCQUFzQjtxQkFDdkI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNQLG9CQUFvQjt3QkFDcEIscUJBQXFCO3dCQUNyQixzQkFBc0I7cUJBQ3ZCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDE5IFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtOZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7U2NpVmlld3BvcnRDb21wb25lbnR9IGZyb20gJy4vdmlld3BvcnQuY29tcG9uZW50JztcbmltcG9ydCB7U2NpU2Nyb2xsYmFyQ29tcG9uZW50fSBmcm9tICcuL3Njcm9sbGJhci9zY3JvbGxiYXIuY29tcG9uZW50JztcbmltcG9ydCB7U2NpU2Nyb2xsYWJsZURpcmVjdGl2ZX0gZnJvbSAnLi9zY3JvbGxhYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQge1Njcm9sbGluZ01vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5cbi8qKlxuICogUHJvdmlkZXMgYSB2aWV3cG9ydCBjb21wb25lbnQgd2l0aCBzY3JvbGxiYXJzIHRoYXQgc2l0IG9uIHRvcCBvZiB0aGUgdmlld3BvcnQgY2xpZW50LlxuICovXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIFNjcm9sbGluZ01vZHVsZSxcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbXG4gICAgU2NpVmlld3BvcnRDb21wb25lbnQsXG4gICAgU2NpU2Nyb2xsYmFyQ29tcG9uZW50LFxuICAgIFNjaVNjcm9sbGFibGVEaXJlY3RpdmUsXG4gIF0sXG4gIGV4cG9ydHM6IFtcbiAgICBTY2lWaWV3cG9ydENvbXBvbmVudCxcbiAgICBTY2lTY3JvbGxiYXJDb21wb25lbnQsXG4gICAgU2NpU2Nyb2xsYWJsZURpcmVjdGl2ZSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2NpVmlld3BvcnRNb2R1bGUge1xufVxuIl19
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { EventEmitter, Directive, Output, Input, NgModule } from '@angular/core';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
import { Subject } from 'rxjs';
|
|
5
|
+
import { takeUntil } from 'rxjs/operators';
|
|
6
|
+
import { fromDimension$, captureElementDimension } from '@scion/toolkit/observable';
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* Copyright (c) 2018-2019 Swiss Federal Railways
|
|
10
|
+
*
|
|
11
|
+
* This program and the accompanying materials are made
|
|
12
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
13
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
14
|
+
*
|
|
15
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Allows observing changes to host element's size.
|
|
19
|
+
*
|
|
20
|
+
* See {@link fromDimension$} Observable for more information.
|
|
21
|
+
*
|
|
22
|
+
* ---
|
|
23
|
+
* Usage:
|
|
24
|
+
*
|
|
25
|
+
* <div sciDimension (sciDimensionChange)="onDimensionChange($event)"></div>
|
|
26
|
+
*/
|
|
27
|
+
class SciDimensionDirective {
|
|
28
|
+
constructor(host, _ngZone) {
|
|
29
|
+
this._ngZone = _ngZone;
|
|
30
|
+
this._destroy$ = new Subject();
|
|
31
|
+
/**
|
|
32
|
+
* Upon subscription, it emits the host element's dimension, and then continuously emits when the dimension of the host element changes.
|
|
33
|
+
*/
|
|
34
|
+
this.dimensionChange = new EventEmitter();
|
|
35
|
+
/**
|
|
36
|
+
* Controls if to emit a dimension change inside or outside of the Angular zone.
|
|
37
|
+
* If emitted outside of the Angular zone no change detection cycle is triggered.
|
|
38
|
+
*
|
|
39
|
+
* By default, if not specified, emits inside the Angular zone.
|
|
40
|
+
*/
|
|
41
|
+
this.emitOutsideAngular = false;
|
|
42
|
+
this._host = host.nativeElement;
|
|
43
|
+
}
|
|
44
|
+
ngOnInit() {
|
|
45
|
+
this.installDimensionListener();
|
|
46
|
+
}
|
|
47
|
+
installDimensionListener() {
|
|
48
|
+
this._ngZone.runOutsideAngular(() => {
|
|
49
|
+
fromDimension$(this._host)
|
|
50
|
+
.pipe(takeUntil(this._destroy$))
|
|
51
|
+
.subscribe((dimension) => {
|
|
52
|
+
if (this.emitOutsideAngular) {
|
|
53
|
+
this.dimensionChange.emit(dimension);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
this._ngZone.run(() => this.dimensionChange.emit(dimension));
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Returns the current dimension of its host element.
|
|
63
|
+
*/
|
|
64
|
+
get dimension() {
|
|
65
|
+
return captureElementDimension(this._host);
|
|
66
|
+
}
|
|
67
|
+
ngOnDestroy() {
|
|
68
|
+
this._destroy$.next();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
SciDimensionDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciDimensionDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive });
|
|
72
|
+
SciDimensionDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.3", type: SciDimensionDirective, selector: "[sciDimension]", inputs: { emitOutsideAngular: "emitOutsideAngular" }, outputs: { dimensionChange: "sciDimensionChange" }, exportAs: ["sciDimension"], ngImport: i0 });
|
|
73
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciDimensionDirective, decorators: [{
|
|
74
|
+
type: Directive,
|
|
75
|
+
args: [{
|
|
76
|
+
selector: '[sciDimension]',
|
|
77
|
+
exportAs: 'sciDimension',
|
|
78
|
+
}]
|
|
79
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { dimensionChange: [{
|
|
80
|
+
type: Output,
|
|
81
|
+
args: ['sciDimensionChange']
|
|
82
|
+
}], emitOutsideAngular: [{
|
|
83
|
+
type: Input
|
|
84
|
+
}] } });
|
|
85
|
+
|
|
86
|
+
/*
|
|
87
|
+
* Copyright (c) 2018-2019 Swiss Federal Railways
|
|
88
|
+
*
|
|
89
|
+
* This program and the accompanying materials are made
|
|
90
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
91
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
92
|
+
*
|
|
93
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
94
|
+
*/
|
|
95
|
+
/**
|
|
96
|
+
* Provides a directive for observing changes to the size of the host element.
|
|
97
|
+
*
|
|
98
|
+
* @see fromDimension$
|
|
99
|
+
*/
|
|
100
|
+
class SciDimensionModule {
|
|
101
|
+
}
|
|
102
|
+
SciDimensionModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciDimensionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
103
|
+
SciDimensionModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciDimensionModule, declarations: [SciDimensionDirective], imports: [CommonModule], exports: [SciDimensionDirective] });
|
|
104
|
+
SciDimensionModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciDimensionModule, imports: [[
|
|
105
|
+
CommonModule,
|
|
106
|
+
]] });
|
|
107
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.3", ngImport: i0, type: SciDimensionModule, decorators: [{
|
|
108
|
+
type: NgModule,
|
|
109
|
+
args: [{
|
|
110
|
+
imports: [
|
|
111
|
+
CommonModule,
|
|
112
|
+
],
|
|
113
|
+
declarations: [
|
|
114
|
+
SciDimensionDirective,
|
|
115
|
+
],
|
|
116
|
+
exports: [
|
|
117
|
+
SciDimensionDirective,
|
|
118
|
+
],
|
|
119
|
+
}]
|
|
120
|
+
}] });
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
* Copyright (c) 2018-2019 Swiss Federal Railways
|
|
124
|
+
*
|
|
125
|
+
* This program and the accompanying materials are made
|
|
126
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
127
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
128
|
+
*
|
|
129
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
130
|
+
*/
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Generated bundle index. Do not edit.
|
|
134
|
+
*/
|
|
135
|
+
|
|
136
|
+
export { SciDimensionDirective, SciDimensionModule };
|
|
137
|
+
//# sourceMappingURL=scion-components-dimension.mjs.map
|
|
@@ -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})\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 {CommonModule} from '@angular/common';\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 CommonModule,\n ],\n declarations: [\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":";;;;;;;AAAA;;;;;;;;;AAeA;;;;;;;;;;MAca,qBAAqB;IAoBhC,YAAY,IAA6B,EAAU,OAAe;QAAf,YAAO,GAAP,OAAO,CAAQ;QAjB1D,cAAS,GAAG,IAAI,OAAO,EAAQ,CAAC;;;;QAMjC,oBAAe,GAAG,IAAI,YAAY,EAAgB,CAAC;;;;;;;QASnD,uBAAkB,GAAG,KAAK,CAAC;QAGhC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC;KACjC;IAEM,QAAQ;QACb,IAAI,CAAC,wBAAwB,EAAE,CAAC;KACjC;IAEO,wBAAwB;QAC9B,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC;YAC7B,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;iBACvB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBAC/B,SAAS,CAAC,CAAC,SAAuB;gBACjC,IAAI,IAAI,CAAC,kBAAkB,EAAE;oBAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBACtC;qBACI;oBACH,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;iBAC9D;aACF,CAAC,CAAC;SACN,CAAC,CAAC;KACJ;;;;IAKD,IAAW,SAAS;QAClB,OAAO,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KAC5C;IAEM,WAAW;QAChB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;KACvB;;kHApDU,qBAAqB;sGAArB,qBAAqB;2FAArB,qBAAqB;kBAJjC,SAAS;mBAAC;oBACT,QAAQ,EAAE,gBAAgB;oBAC1B,QAAQ,EAAE,cAAc;iBACzB;sHAUQ,eAAe;sBADrB,MAAM;uBAAC,oBAAoB;gBAUrB,kBAAkB;sBADxB,KAAK;;;AC9CR;;;;;;;;;AAcA;;;;;MAgBa,kBAAkB;;+GAAlB,kBAAkB;gHAAlB,kBAAkB,iBAN3B,qBAAqB,aAHrB,YAAY,aAMZ,qBAAqB;gHAGZ,kBAAkB,YAVpB;YACP,YAAY;SACb;2FAQU,kBAAkB;kBAX9B,QAAQ;mBAAC;oBACR,OAAO,EAAE;wBACP,YAAY;qBACb;oBACD,YAAY,EAAE;wBACZ,qBAAqB;qBACtB;oBACD,OAAO,EAAE;wBACP,qBAAqB;qBACtB;iBACF;;;AC7BD;;;;;;;;;;ACAA;;;;;;"}
|