@skyux/core 5.0.0 → 5.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.
@@ -2935,6 +2935,77 @@
2935
2935
  }]
2936
2936
  }] });
2937
2937
 
2938
+ var SkyScrollableHostService = /** @class */ (function () {
2939
+ function SkyScrollableHostService(mutationObserverSvc, windowRef) {
2940
+ this.mutationObserverSvc = mutationObserverSvc;
2941
+ this.windowRef = windowRef;
2942
+ }
2943
+ SkyScrollableHostService.prototype.getScrollabeHost = function (elementRef) {
2944
+ return this.findScrollableHost(elementRef.nativeElement);
2945
+ };
2946
+ SkyScrollableHostService.prototype.watchScrollableHost = function (elementRef, completionObservable) {
2947
+ var _this = this;
2948
+ var scrollableHost = this.findScrollableHost(elementRef.nativeElement);
2949
+ var behaviorSubject = new rxjs.BehaviorSubject(scrollableHost);
2950
+ var mutationObserver = this.mutationObserverSvc.create(function () {
2951
+ var newScrollableHost = _this.findScrollableHost(elementRef.nativeElement);
2952
+ if (newScrollableHost !== scrollableHost) {
2953
+ scrollableHost = newScrollableHost;
2954
+ _this.observeForScrollableHostChanges(scrollableHost, mutationObserver);
2955
+ behaviorSubject.next(scrollableHost);
2956
+ }
2957
+ });
2958
+ this.observeForScrollableHostChanges(scrollableHost, mutationObserver);
2959
+ completionObservable.pipe(operators.take(1)).subscribe(function () {
2960
+ mutationObserver.disconnect();
2961
+ });
2962
+ return behaviorSubject;
2963
+ };
2964
+ SkyScrollableHostService.prototype.findScrollableHost = function (element) {
2965
+ var regex = /(auto|scroll)/;
2966
+ var windowObj = this.windowRef.nativeWindow;
2967
+ var bodyObj = windowObj.document.body;
2968
+ var style = windowObj.getComputedStyle(element);
2969
+ var parent = element;
2970
+ do {
2971
+ parent = parent.parentNode;
2972
+ style = windowObj.getComputedStyle(parent);
2973
+ } while (!regex.test(style.overflow) &&
2974
+ !regex.test(style.overflowY) &&
2975
+ parent !== bodyObj);
2976
+ if (parent === bodyObj) {
2977
+ return windowObj;
2978
+ }
2979
+ return parent;
2980
+ };
2981
+ SkyScrollableHostService.prototype.observeForScrollableHostChanges = function (element, mutationObserver) {
2982
+ mutationObserver.disconnect();
2983
+ if (element instanceof HTMLElement) {
2984
+ mutationObserver.observe(element, {
2985
+ attributes: true,
2986
+ attributeFilter: ["class", "style.overflow", "style.overflow-y"],
2987
+ subtree: true
2988
+ });
2989
+ }
2990
+ else {
2991
+ mutationObserver.observe(document.documentElement, {
2992
+ attributes: true,
2993
+ attributeFilter: ["class", "style.overflow", "style.overflow-y"],
2994
+ subtree: true
2995
+ });
2996
+ }
2997
+ };
2998
+ return SkyScrollableHostService;
2999
+ }());
3000
+ SkyScrollableHostService.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0__namespace, type: SkyScrollableHostService, deps: [{ token: MutationObserverService }, { token: SkyAppWindowRef }], target: i0__namespace.ɵɵFactoryTarget.Injectable });
3001
+ SkyScrollableHostService.ɵprov = i0__namespace.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0__namespace, type: SkyScrollableHostService, providedIn: 'root' });
3002
+ i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0__namespace, type: SkyScrollableHostService, decorators: [{
3003
+ type: i0.Injectable,
3004
+ args: [{
3005
+ providedIn: 'root'
3006
+ }]
3007
+ }], ctorParameters: function () { return [{ type: MutationObserverService }, { type: SkyAppWindowRef }]; } });
3008
+
2938
3009
  /**
2939
3010
  * Provides a method for setting a formatted title on the current window.
2940
3011
  */
@@ -3011,11 +3082,12 @@
3011
3082
  nextIdIndex = (nextIdIndex || 0) + 1;
3012
3083
  return 'viewkeeper-' + nextIdIndex;
3013
3084
  }
3014
- function getOffset(el) {
3085
+ function getOffset(el, scrollableHost) {
3015
3086
  var rect = el.getBoundingClientRect();
3087
+ var parent = scrollableHost ? scrollableHost : document.documentElement;
3016
3088
  return {
3017
- top: rect.top + document.documentElement.scrollTop,
3018
- left: rect.left + document.documentElement.scrollLeft
3089
+ top: rect.top + parent.scrollTop,
3090
+ left: rect.left + parent.scrollLeft
3019
3091
  };
3020
3092
  }
3021
3093
  function px(value) {
@@ -3052,6 +3124,7 @@
3052
3124
  this.id = nextId();
3053
3125
  this.el = options.el;
3054
3126
  this.boundaryEl = options.boundaryEl;
3127
+ this.scrollableHost = options.scrollableHost;
3055
3128
  this.verticalOffset = options.verticalOffset || 0;
3056
3129
  this.verticalOffsetEl = options.verticalOffsetEl;
3057
3130
  this.viewportMarginTop = options.viewportMarginTop || 0;
@@ -3059,7 +3132,7 @@
3059
3132
  if (this.verticalOffsetEl) {
3060
3133
  this.verticalOffsetEl.addEventListener(EVT_AFTER_VIEWKEEPER_SYNC, this.syncElPositionHandler);
3061
3134
  }
3062
- window.addEventListener('scroll', this.syncElPositionHandler);
3135
+ window.addEventListener('scroll', this.syncElPositionHandler, true);
3063
3136
  window.addEventListener('resize', this.syncElPositionHandler);
3064
3137
  window.addEventListener('orientationchange', this.syncElPositionHandler);
3065
3138
  ensureStyleEl();
@@ -3087,7 +3160,7 @@
3087
3160
  };
3088
3161
  SkyViewkeeper.prototype.destroy = function () {
3089
3162
  if (!this.isDestroyed) {
3090
- window.removeEventListener('scroll', this.syncElPositionHandler);
3163
+ window.removeEventListener('scroll', this.syncElPositionHandler, true);
3091
3164
  window.removeEventListener('resize', this.syncElPositionHandler);
3092
3165
  window.removeEventListener('orientationchange', this.syncElPositionHandler);
3093
3166
  this.unfixEl();
@@ -3125,16 +3198,19 @@
3125
3198
  var verticalOffsetElTop = parseInt(verticalOffsetElTopStyle, 10) || 0;
3126
3199
  offset += (this.verticalOffsetEl.offsetHeight + verticalOffsetElTop);
3127
3200
  }
3201
+ else if (this.scrollableHost) {
3202
+ offset += this.scrollableHost.getBoundingClientRect().top;
3203
+ }
3128
3204
  return offset;
3129
3205
  };
3130
3206
  SkyViewkeeper.prototype.shouldFixEl = function (boundaryInfo, verticalOffset) {
3131
3207
  var anchorTop;
3132
3208
  var doFixEl;
3133
3209
  if (boundaryInfo.spacerEl) {
3134
- anchorTop = getOffset(boundaryInfo.spacerEl).top;
3210
+ anchorTop = getOffset(boundaryInfo.spacerEl, this.scrollableHost).top;
3135
3211
  }
3136
3212
  else {
3137
- anchorTop = getOffset(this.el).top;
3213
+ anchorTop = getOffset(this.el, this.scrollableHost).top;
3138
3214
  }
3139
3215
  doFixEl = boundaryInfo.scrollTop + verticalOffset + this.viewportMarginTop > anchorTop;
3140
3216
  return doFixEl;
@@ -3193,11 +3269,11 @@
3193
3269
  var spacerId = this.getSpacerId();
3194
3270
  var spacerEl = document.getElementById(spacerId);
3195
3271
  var boundaryEl = this.boundaryEl;
3196
- var boundaryOffset = getOffset(boundaryEl);
3272
+ var boundaryOffset = getOffset(boundaryEl, this.scrollableHost);
3197
3273
  var boundaryTop = boundaryOffset.top;
3198
3274
  var boundaryBottom = boundaryTop + boundaryEl.getBoundingClientRect().height;
3199
- var scrollLeft = document.documentElement.scrollLeft;
3200
- var scrollTop = document.documentElement.scrollTop;
3275
+ var scrollLeft = this.scrollableHost ? this.scrollableHost.scrollLeft : document.documentElement.scrollLeft;
3276
+ var scrollTop = this.scrollableHost ? this.scrollableHost.scrollTop : document.documentElement.scrollTop;
3201
3277
  var elHeight = getHeightWithMargin(this.el);
3202
3278
  return {
3203
3279
  boundaryBottom: boundaryBottom,
@@ -3251,11 +3327,13 @@
3251
3327
  } });
3252
3328
 
3253
3329
  var SkyViewkeeperDirective = /** @class */ (function () {
3254
- function SkyViewkeeperDirective(el, mutationObserverSvc, viewkeeperSvc) {
3330
+ function SkyViewkeeperDirective(el, mutationObserverSvc, viewkeeperSvc, scrollableHostService) {
3255
3331
  this.el = el;
3256
3332
  this.mutationObserverSvc = mutationObserverSvc;
3257
3333
  this.viewkeeperSvc = viewkeeperSvc;
3334
+ this.scrollableHostService = scrollableHostService;
3258
3335
  this.viewkeepers = [];
3336
+ this.scrollableHostWatchUnsubscribe = undefined;
3259
3337
  }
3260
3338
  Object.defineProperty(SkyViewkeeperDirective.prototype, "skyViewkeeper", {
3261
3339
  get: function () {
@@ -3336,43 +3414,60 @@
3336
3414
  return false;
3337
3415
  };
3338
3416
  SkyViewkeeperDirective.prototype.detectElements = function () {
3339
- var e_3, _a;
3417
+ var _this = this;
3340
3418
  var viewkeeperEls = this.getViewkeeperEls();
3341
3419
  if (this.viewkeeperElsChanged(viewkeeperEls)) {
3342
- this.destroyViewkeepers();
3343
- var previousViewkeeperEl = void 0;
3344
- try {
3345
- for (var viewkeeperEls_1 = __values(viewkeeperEls), viewkeeperEls_1_1 = viewkeeperEls_1.next(); !viewkeeperEls_1_1.done; viewkeeperEls_1_1 = viewkeeperEls_1.next()) {
3346
- var viewkeeperEl = viewkeeperEls_1_1.value;
3347
- this.viewkeepers.push(this.viewkeeperSvc.create({
3348
- boundaryEl: this.el.nativeElement,
3349
- el: viewkeeperEl,
3350
- setWidth: true,
3351
- verticalOffsetEl: previousViewkeeperEl
3352
- }));
3353
- previousViewkeeperEl = viewkeeperEl;
3354
- }
3420
+ if (this.scrollableHostWatchUnsubscribe) {
3421
+ this.scrollableHostWatchUnsubscribe.next();
3422
+ this.scrollableHostWatchUnsubscribe = new rxjs.Subject();
3355
3423
  }
3356
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
3357
- finally {
3424
+ else {
3425
+ this.scrollableHostWatchUnsubscribe = new rxjs.Subject();
3426
+ }
3427
+ this.scrollableHostService.watchScrollableHost(this.el, this.scrollableHostWatchUnsubscribe)
3428
+ .pipe(operators.takeUntil(this.scrollableHostWatchUnsubscribe))
3429
+ .subscribe(function (scrollableHost) {
3430
+ var e_3, _a;
3431
+ _this.destroyViewkeepers();
3432
+ var previousViewkeeperEl;
3358
3433
  try {
3359
- if (viewkeeperEls_1_1 && !viewkeeperEls_1_1.done && (_a = viewkeeperEls_1.return)) _a.call(viewkeeperEls_1);
3434
+ for (var viewkeeperEls_1 = __values(viewkeeperEls), viewkeeperEls_1_1 = viewkeeperEls_1.next(); !viewkeeperEls_1_1.done; viewkeeperEls_1_1 = viewkeeperEls_1.next()) {
3435
+ var viewkeeperEl = viewkeeperEls_1_1.value;
3436
+ _this.viewkeepers.push(_this.viewkeeperSvc.create({
3437
+ boundaryEl: _this.el.nativeElement,
3438
+ scrollableHost: scrollableHost instanceof HTMLElement ? scrollableHost : undefined,
3439
+ el: viewkeeperEl,
3440
+ setWidth: true,
3441
+ verticalOffsetEl: previousViewkeeperEl
3442
+ }));
3443
+ previousViewkeeperEl = viewkeeperEl;
3444
+ }
3360
3445
  }
3361
- finally { if (e_3) throw e_3.error; }
3362
- }
3446
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
3447
+ finally {
3448
+ try {
3449
+ if (viewkeeperEls_1_1 && !viewkeeperEls_1_1.done && (_a = viewkeeperEls_1.return)) _a.call(viewkeeperEls_1);
3450
+ }
3451
+ finally { if (e_3) throw e_3.error; }
3452
+ }
3453
+ });
3363
3454
  this.currentViewkeeperEls = viewkeeperEls;
3364
3455
  }
3365
3456
  };
3366
3457
  return SkyViewkeeperDirective;
3367
3458
  }());
3368
- SkyViewkeeperDirective.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0__namespace, type: SkyViewkeeperDirective, deps: [{ token: i0__namespace.ElementRef }, { token: MutationObserverService }, { token: SkyViewkeeperService }], target: i0__namespace.ɵɵFactoryTarget.Directive });
3459
+ SkyViewkeeperDirective.ɵfac = i0__namespace.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0__namespace, type: SkyViewkeeperDirective, deps: [{ token: i0__namespace.ElementRef }, { token: MutationObserverService }, { token: SkyViewkeeperService }, { token: SkyScrollableHostService, optional: true }], target: i0__namespace.ɵɵFactoryTarget.Directive });
3369
3460
  SkyViewkeeperDirective.ɵdir = i0__namespace.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "12.2.7", type: SkyViewkeeperDirective, selector: "[skyViewkeeper]", inputs: { skyViewkeeper: "skyViewkeeper" }, ngImport: i0__namespace });
3370
3461
  i0__namespace.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.7", ngImport: i0__namespace, type: SkyViewkeeperDirective, decorators: [{
3371
3462
  type: i0.Directive,
3372
3463
  args: [{
3373
3464
  selector: '[skyViewkeeper]'
3374
3465
  }]
3375
- }], ctorParameters: function () { return [{ type: i0__namespace.ElementRef }, { type: MutationObserverService }, { type: SkyViewkeeperService }]; }, propDecorators: { skyViewkeeper: [{
3466
+ }], ctorParameters: function () {
3467
+ return [{ type: i0__namespace.ElementRef }, { type: MutationObserverService }, { type: SkyViewkeeperService }, { type: SkyScrollableHostService, decorators: [{
3468
+ type: i0.Optional
3469
+ }] }];
3470
+ }, propDecorators: { skyViewkeeper: [{
3376
3471
  type: i0.Input
3377
3472
  }] } });
3378
3473
 
@@ -3428,6 +3523,7 @@
3428
3523
  exports.SkyOverlayService = SkyOverlayService;
3429
3524
  exports.SkyPercentPipe = SkyPercentPipe;
3430
3525
  exports.SkyPercentPipeModule = SkyPercentPipeModule;
3526
+ exports.SkyScrollableHostService = SkyScrollableHostService;
3431
3527
  exports.SkyUIConfigService = SkyUIConfigService;
3432
3528
  exports.SkyViewkeeperHostOptions = SkyViewkeeperHostOptions;
3433
3529
  exports.SkyViewkeeperModule = SkyViewkeeperModule;