@skyux/core 4.8.1 → 4.9.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 (39) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/bundles/skyux-core.umd.js +155 -33
  3. package/bundles/skyux-core.umd.js.map +1 -1
  4. package/bundles/skyux-core.umd.min.js +1 -1
  5. package/bundles/skyux-core.umd.min.js.map +1 -1
  6. package/esm2015/modules/dock/dock.component.js +1 -1
  7. package/esm2015/modules/scrollable-host/scrollable-host.module.js +16 -0
  8. package/esm2015/modules/scrollable-host/scrollable-host.service.js +89 -0
  9. package/esm2015/modules/viewkeeper/viewkeeper-host-options.js +1 -1
  10. package/esm2015/modules/viewkeeper/viewkeeper-options.js +1 -1
  11. package/esm2015/modules/viewkeeper/viewkeeper.directive.js +35 -16
  12. package/esm2015/modules/viewkeeper/viewkeeper.js +16 -11
  13. package/esm2015/modules/viewkeeper/viewkeeper.module.js +5 -1
  14. package/esm2015/public_api.js +2 -1
  15. package/esm2015/skyux-core.js +2 -1
  16. package/esm5/modules/dock/dock.component.js +1 -1
  17. package/esm5/modules/scrollable-host/scrollable-host.module.js +19 -0
  18. package/esm5/modules/scrollable-host/scrollable-host.service.js +91 -0
  19. package/esm5/modules/viewkeeper/viewkeeper-host-options.js +1 -1
  20. package/esm5/modules/viewkeeper/viewkeeper-options.js +1 -1
  21. package/esm5/modules/viewkeeper/viewkeeper.directive.js +45 -25
  22. package/esm5/modules/viewkeeper/viewkeeper.js +16 -11
  23. package/esm5/modules/viewkeeper/viewkeeper.module.js +5 -1
  24. package/esm5/public_api.js +2 -1
  25. package/esm5/skyux-core.js +2 -1
  26. package/fesm2015/skyux-core.js +140 -26
  27. package/fesm2015/skyux-core.js.map +1 -1
  28. package/fesm5/skyux-core.js +155 -35
  29. package/fesm5/skyux-core.js.map +1 -1
  30. package/modules/scrollable-host/scrollable-host.module.d.ts +2 -0
  31. package/modules/scrollable-host/scrollable-host.service.d.ts +13 -0
  32. package/modules/viewkeeper/viewkeeper-host-options.d.ts +1 -0
  33. package/modules/viewkeeper/viewkeeper-options.d.ts +5 -0
  34. package/modules/viewkeeper/viewkeeper.d.ts +1 -0
  35. package/modules/viewkeeper/viewkeeper.directive.d.ts +4 -1
  36. package/package.json +1 -1
  37. package/public_api.d.ts +1 -0
  38. package/skyux-core.d.ts +1 -0
  39. package/skyux-core.metadata.json +1 -1
@@ -2,7 +2,7 @@ import { __decorate, __assign, __read, __param, __values, __spread } from 'tslib
2
2
  import { RendererFactory2, Injectable, NgModule, EventEmitter, ElementRef, Input, Output, Directive, ComponentFactoryResolver, ApplicationRef, Injector, ChangeDetectorRef, ViewChild, ViewContainerRef, Component, ChangeDetectionStrategy, ɵɵdefineInjectable, ɵɵinject, Renderer2, NgZone, Pipe, Optional } from '@angular/core';
3
3
  import { CommonModule } from '@angular/common';
4
4
  import { Subject, fromEvent, BehaviorSubject, of } from 'rxjs';
5
- import { takeUntil, debounceTime } from 'rxjs/operators';
5
+ import { takeUntil, debounceTime, take } from 'rxjs/operators';
6
6
  import { getStringForLocale, SKY_LIB_RESOURCES_PROVIDERS, SkyIntlNumberFormatStyle, SkyIntlNumberFormatter, SkyLibResourcesService, SkyAppLocaleProvider, SkyI18nModule } from '@skyux/i18n';
7
7
  import { NavigationStart, Router, RouterModule } from '@angular/router';
8
8
  import { Title } from '@angular/platform-browser';
@@ -1276,7 +1276,7 @@ var SkyDockComponent = /** @class */ (function () {
1276
1276
  SkyDockDomAdapterService
1277
1277
  ],
1278
1278
  changeDetection: ChangeDetectionStrategy.OnPush,
1279
- styles: [":host{display:flex;flex-direction:column;width:100%}:host:not(.sky-dock-unbound){position:fixed;left:0;bottom:0;right:0}:host.sky-dock-sticky{position:sticky}"]
1279
+ styles: [":host{display:flex;flex-direction:column;width:100%}:host:not(.sky-dock-unbound){position:fixed;left:0;bottom:0;right:0}:host.sky-dock-sticky{position:-webkit-sticky;position:sticky}"]
1280
1280
  })
1281
1281
  ], SkyDockComponent);
1282
1282
  return SkyDockComponent;
@@ -2528,6 +2528,87 @@ var SkyPercentPipeModule = /** @class */ (function () {
2528
2528
  return SkyPercentPipeModule;
2529
2529
  }());
2530
2530
 
2531
+ var SkyScrollableHostService = /** @class */ (function () {
2532
+ function SkyScrollableHostService(mutationObserverSvc, windowRef) {
2533
+ this.mutationObserverSvc = mutationObserverSvc;
2534
+ this.windowRef = windowRef;
2535
+ }
2536
+ SkyScrollableHostService.prototype.getScrollabeHost = function (elementRef) {
2537
+ return this.findScrollableHost(elementRef.nativeElement);
2538
+ };
2539
+ SkyScrollableHostService.prototype.watchScrollableHost = function (elementRef, completionObservable) {
2540
+ var _this = this;
2541
+ var scrollableHost = this.findScrollableHost(elementRef.nativeElement);
2542
+ var behaviorSubject = new BehaviorSubject(scrollableHost);
2543
+ var mutationObserver = this.mutationObserverSvc.create(function () {
2544
+ var newScrollableHost = _this.findScrollableHost(elementRef.nativeElement);
2545
+ if (newScrollableHost !== scrollableHost) {
2546
+ scrollableHost = newScrollableHost;
2547
+ _this.observeForScrollableHostChanges(scrollableHost, mutationObserver);
2548
+ behaviorSubject.next(scrollableHost);
2549
+ }
2550
+ });
2551
+ this.observeForScrollableHostChanges(scrollableHost, mutationObserver);
2552
+ completionObservable.pipe(take(1)).subscribe(function () {
2553
+ mutationObserver.disconnect();
2554
+ });
2555
+ return behaviorSubject;
2556
+ };
2557
+ SkyScrollableHostService.prototype.findScrollableHost = function (element) {
2558
+ var regex = /(auto|scroll)/;
2559
+ var windowObj = this.windowRef.nativeWindow;
2560
+ var bodyObj = windowObj.document.body;
2561
+ /* Sanity check */
2562
+ if (!element) {
2563
+ return windowObj;
2564
+ }
2565
+ var style = windowObj.getComputedStyle(element);
2566
+ var parent = element;
2567
+ do {
2568
+ parent = parent.parentNode;
2569
+ /* Sanity check for if this function is called for an element which has been removed from the DOM */
2570
+ if (!(parent instanceof HTMLElement)) {
2571
+ return windowObj;
2572
+ }
2573
+ style = windowObj.getComputedStyle(parent);
2574
+ } while (!regex.test(style.overflow) &&
2575
+ !regex.test(style.overflowY) &&
2576
+ parent !== bodyObj);
2577
+ if (parent === bodyObj) {
2578
+ return windowObj;
2579
+ }
2580
+ return parent;
2581
+ };
2582
+ SkyScrollableHostService.prototype.observeForScrollableHostChanges = function (element, mutationObserver) {
2583
+ mutationObserver.disconnect();
2584
+ if (element instanceof HTMLElement) {
2585
+ mutationObserver.observe(element, {
2586
+ attributes: true,
2587
+ attributeFilter: ['class', 'style.overflow', 'style.overflow-y'],
2588
+ subtree: true
2589
+ });
2590
+ }
2591
+ else {
2592
+ mutationObserver.observe(document.documentElement, {
2593
+ attributes: true,
2594
+ attributeFilter: ['class', 'style.overflow', 'style.overflow-y'],
2595
+ subtree: true
2596
+ });
2597
+ }
2598
+ };
2599
+ SkyScrollableHostService.ctorParameters = function () { return [
2600
+ { type: MutationObserverService },
2601
+ { type: SkyAppWindowRef }
2602
+ ]; };
2603
+ SkyScrollableHostService.ɵprov = ɵɵdefineInjectable({ factory: function SkyScrollableHostService_Factory() { return new SkyScrollableHostService(ɵɵinject(MutationObserverService), ɵɵinject(SkyAppWindowRef)); }, token: SkyScrollableHostService, providedIn: "root" });
2604
+ SkyScrollableHostService = __decorate([
2605
+ Injectable({
2606
+ providedIn: 'root'
2607
+ })
2608
+ ], SkyScrollableHostService);
2609
+ return SkyScrollableHostService;
2610
+ }());
2611
+
2531
2612
  /**
2532
2613
  * Provides a method for setting a formatted title on the current window.
2533
2614
  */
@@ -2595,11 +2676,12 @@ function nextId() {
2595
2676
  nextIdIndex = (nextIdIndex || 0) + 1;
2596
2677
  return 'viewkeeper-' + nextIdIndex;
2597
2678
  }
2598
- function getOffset(el) {
2679
+ function getOffset(el, scrollableHost) {
2599
2680
  var rect = el.getBoundingClientRect();
2681
+ var parent = scrollableHost ? scrollableHost : document.documentElement;
2600
2682
  return {
2601
- top: rect.top + document.documentElement.scrollTop,
2602
- left: rect.left + document.documentElement.scrollLeft
2683
+ top: rect.top + parent.scrollTop,
2684
+ left: rect.left + parent.scrollLeft
2603
2685
  };
2604
2686
  }
2605
2687
  function px(value) {
@@ -2636,6 +2718,7 @@ var SkyViewkeeper = /** @class */ (function () {
2636
2718
  this.id = nextId();
2637
2719
  this.el = options.el;
2638
2720
  this.boundaryEl = options.boundaryEl;
2721
+ this.scrollableHost = options.scrollableHost;
2639
2722
  this.verticalOffset = options.verticalOffset || 0;
2640
2723
  this.verticalOffsetEl = options.verticalOffsetEl;
2641
2724
  this.viewportMarginTop = options.viewportMarginTop || 0;
@@ -2643,7 +2726,7 @@ var SkyViewkeeper = /** @class */ (function () {
2643
2726
  if (this.verticalOffsetEl) {
2644
2727
  this.verticalOffsetEl.addEventListener(EVT_AFTER_VIEWKEEPER_SYNC, this.syncElPositionHandler);
2645
2728
  }
2646
- window.addEventListener('scroll', this.syncElPositionHandler);
2729
+ window.addEventListener('scroll', this.syncElPositionHandler, true);
2647
2730
  window.addEventListener('resize', this.syncElPositionHandler);
2648
2731
  window.addEventListener('orientationchange', this.syncElPositionHandler);
2649
2732
  ensureStyleEl();
@@ -2671,7 +2754,7 @@ var SkyViewkeeper = /** @class */ (function () {
2671
2754
  };
2672
2755
  SkyViewkeeper.prototype.destroy = function () {
2673
2756
  if (!this.isDestroyed) {
2674
- window.removeEventListener('scroll', this.syncElPositionHandler);
2757
+ window.removeEventListener('scroll', this.syncElPositionHandler, true);
2675
2758
  window.removeEventListener('resize', this.syncElPositionHandler);
2676
2759
  window.removeEventListener('orientationchange', this.syncElPositionHandler);
2677
2760
  this.unfixEl();
@@ -2709,16 +2792,19 @@ var SkyViewkeeper = /** @class */ (function () {
2709
2792
  var verticalOffsetElTop = parseInt(verticalOffsetElTopStyle, 10) || 0;
2710
2793
  offset += (this.verticalOffsetEl.offsetHeight + verticalOffsetElTop);
2711
2794
  }
2795
+ else if (this.scrollableHost) {
2796
+ offset += this.scrollableHost.getBoundingClientRect().top;
2797
+ }
2712
2798
  return offset;
2713
2799
  };
2714
2800
  SkyViewkeeper.prototype.shouldFixEl = function (boundaryInfo, verticalOffset) {
2715
2801
  var anchorTop;
2716
2802
  var doFixEl;
2717
2803
  if (boundaryInfo.spacerEl) {
2718
- anchorTop = getOffset(boundaryInfo.spacerEl).top;
2804
+ anchorTop = getOffset(boundaryInfo.spacerEl, this.scrollableHost).top;
2719
2805
  }
2720
2806
  else {
2721
- anchorTop = getOffset(this.el).top;
2807
+ anchorTop = getOffset(this.el, this.scrollableHost).top;
2722
2808
  }
2723
2809
  doFixEl = boundaryInfo.scrollTop + verticalOffset + this.viewportMarginTop > anchorTop;
2724
2810
  return doFixEl;
@@ -2777,11 +2863,11 @@ var SkyViewkeeper = /** @class */ (function () {
2777
2863
  var spacerId = this.getSpacerId();
2778
2864
  var spacerEl = document.getElementById(spacerId);
2779
2865
  var boundaryEl = this.boundaryEl;
2780
- var boundaryOffset = getOffset(boundaryEl);
2866
+ var boundaryOffset = getOffset(boundaryEl, this.scrollableHost);
2781
2867
  var boundaryTop = boundaryOffset.top;
2782
2868
  var boundaryBottom = boundaryTop + boundaryEl.getBoundingClientRect().height;
2783
- var scrollLeft = document.documentElement.scrollLeft;
2784
- var scrollTop = document.documentElement.scrollTop;
2869
+ var scrollLeft = this.scrollableHost ? this.scrollableHost.scrollLeft : document.documentElement.scrollLeft;
2870
+ var scrollTop = this.scrollableHost ? this.scrollableHost.scrollTop : document.documentElement.scrollTop;
2785
2871
  var elHeight = getHeightWithMargin(this.el);
2786
2872
  return {
2787
2873
  boundaryBottom: boundaryBottom,
@@ -2830,11 +2916,13 @@ var SkyViewkeeperService = /** @class */ (function () {
2830
2916
  }());
2831
2917
 
2832
2918
  var SkyViewkeeperDirective = /** @class */ (function () {
2833
- function SkyViewkeeperDirective(el, mutationObserverSvc, viewkeeperSvc) {
2919
+ function SkyViewkeeperDirective(el, mutationObserverSvc, viewkeeperSvc, scrollableHostService) {
2834
2920
  this.el = el;
2835
2921
  this.mutationObserverSvc = mutationObserverSvc;
2836
2922
  this.viewkeeperSvc = viewkeeperSvc;
2923
+ this.scrollableHostService = scrollableHostService;
2837
2924
  this.viewkeepers = [];
2925
+ this.scrollableHostWatchUnsubscribe = undefined;
2838
2926
  }
2839
2927
  Object.defineProperty(SkyViewkeeperDirective.prototype, "skyViewkeeper", {
2840
2928
  get: function () {
@@ -2915,37 +3003,51 @@ var SkyViewkeeperDirective = /** @class */ (function () {
2915
3003
  return false;
2916
3004
  };
2917
3005
  SkyViewkeeperDirective.prototype.detectElements = function () {
2918
- var e_3, _a;
3006
+ var _this = this;
2919
3007
  var viewkeeperEls = this.getViewkeeperEls();
2920
3008
  if (this.viewkeeperElsChanged(viewkeeperEls)) {
2921
- this.destroyViewkeepers();
2922
- var previousViewkeeperEl = void 0;
2923
- try {
2924
- for (var viewkeeperEls_1 = __values(viewkeeperEls), viewkeeperEls_1_1 = viewkeeperEls_1.next(); !viewkeeperEls_1_1.done; viewkeeperEls_1_1 = viewkeeperEls_1.next()) {
2925
- var viewkeeperEl = viewkeeperEls_1_1.value;
2926
- this.viewkeepers.push(this.viewkeeperSvc.create({
2927
- boundaryEl: this.el.nativeElement,
2928
- el: viewkeeperEl,
2929
- setWidth: true,
2930
- verticalOffsetEl: previousViewkeeperEl
2931
- }));
2932
- previousViewkeeperEl = viewkeeperEl;
2933
- }
3009
+ if (this.scrollableHostWatchUnsubscribe) {
3010
+ this.scrollableHostWatchUnsubscribe.next();
3011
+ this.scrollableHostWatchUnsubscribe = new Subject();
2934
3012
  }
2935
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
2936
- finally {
3013
+ else {
3014
+ this.scrollableHostWatchUnsubscribe = new Subject();
3015
+ }
3016
+ this.scrollableHostService.watchScrollableHost(this.el, this.scrollableHostWatchUnsubscribe)
3017
+ .pipe(takeUntil(this.scrollableHostWatchUnsubscribe))
3018
+ .subscribe(function (scrollableHost) {
3019
+ var e_3, _a;
3020
+ _this.destroyViewkeepers();
3021
+ var previousViewkeeperEl;
2937
3022
  try {
2938
- if (viewkeeperEls_1_1 && !viewkeeperEls_1_1.done && (_a = viewkeeperEls_1.return)) _a.call(viewkeeperEls_1);
3023
+ for (var viewkeeperEls_1 = __values(viewkeeperEls), viewkeeperEls_1_1 = viewkeeperEls_1.next(); !viewkeeperEls_1_1.done; viewkeeperEls_1_1 = viewkeeperEls_1.next()) {
3024
+ var viewkeeperEl = viewkeeperEls_1_1.value;
3025
+ _this.viewkeepers.push(_this.viewkeeperSvc.create({
3026
+ boundaryEl: _this.el.nativeElement,
3027
+ scrollableHost: scrollableHost instanceof HTMLElement ? scrollableHost : undefined,
3028
+ el: viewkeeperEl,
3029
+ setWidth: true,
3030
+ verticalOffsetEl: previousViewkeeperEl
3031
+ }));
3032
+ previousViewkeeperEl = viewkeeperEl;
3033
+ }
2939
3034
  }
2940
- finally { if (e_3) throw e_3.error; }
2941
- }
3035
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
3036
+ finally {
3037
+ try {
3038
+ if (viewkeeperEls_1_1 && !viewkeeperEls_1_1.done && (_a = viewkeeperEls_1.return)) _a.call(viewkeeperEls_1);
3039
+ }
3040
+ finally { if (e_3) throw e_3.error; }
3041
+ }
3042
+ });
2942
3043
  this.currentViewkeeperEls = viewkeeperEls;
2943
3044
  }
2944
3045
  };
2945
3046
  SkyViewkeeperDirective.ctorParameters = function () { return [
2946
3047
  { type: ElementRef },
2947
3048
  { type: MutationObserverService },
2948
- { type: SkyViewkeeperService }
3049
+ { type: SkyViewkeeperService },
3050
+ { type: SkyScrollableHostService, decorators: [{ type: Optional }] }
2949
3051
  ]; };
2950
3052
  __decorate([
2951
3053
  Input()
@@ -2953,11 +3055,26 @@ var SkyViewkeeperDirective = /** @class */ (function () {
2953
3055
  SkyViewkeeperDirective = __decorate([
2954
3056
  Directive({
2955
3057
  selector: '[skyViewkeeper]'
2956
- })
3058
+ }),
3059
+ __param(3, Optional())
2957
3060
  ], SkyViewkeeperDirective);
2958
3061
  return SkyViewkeeperDirective;
2959
3062
  }());
2960
3063
 
3064
+ var SkyScrollableHostModule = /** @class */ (function () {
3065
+ function SkyScrollableHostModule() {
3066
+ }
3067
+ SkyScrollableHostModule = __decorate([
3068
+ NgModule({
3069
+ providers: [
3070
+ MutationObserverService,
3071
+ SkyAppWindowRef
3072
+ ]
3073
+ })
3074
+ ], SkyScrollableHostModule);
3075
+ return SkyScrollableHostModule;
3076
+ }());
3077
+
2961
3078
  var SkyViewkeeperModule = /** @class */ (function () {
2962
3079
  function SkyViewkeeperModule() {
2963
3080
  }
@@ -2966,6 +3083,9 @@ var SkyViewkeeperModule = /** @class */ (function () {
2966
3083
  declarations: [
2967
3084
  SkyViewkeeperDirective
2968
3085
  ],
3086
+ imports: [
3087
+ SkyScrollableHostModule
3088
+ ],
2969
3089
  exports: [
2970
3090
  SkyViewkeeperDirective
2971
3091
  ],
@@ -2982,5 +3102,5 @@ var SkyViewkeeperModule = /** @class */ (function () {
2982
3102
  * Generated bundle index. Do not edit.
2983
3103
  */
2984
3104
 
2985
- export { MutationObserverService, NumericOptions, SkyAffixAutoFitContext, SkyAffixModule, SkyAffixService, SkyAffixer, SkyAppFormat, SkyAppTitleService, SkyAppWindowRef, SkyCoreAdapterModule, SkyCoreAdapterService, SkyDockItem, SkyDockLocation, SkyDockModule, SkyDockService, SkyDynamicComponentLocation, SkyDynamicComponentModule, SkyDynamicComponentService, SkyIdModule, SkyLogModule, SkyLogService, SkyMediaBreakpoints, SkyMediaQueryModule, SkyMediaQueryService, SkyNumericModule, SkyNumericPipe, SkyNumericService, SkyOverlayInstance, SkyOverlayModule, SkyOverlayService, SkyPercentPipe, SkyPercentPipeModule, SkyUIConfigService, SkyViewkeeperHostOptions, SkyViewkeeperModule, SkyViewkeeperService, getWindow, SkyAffixDirective as ɵa, SkyDockComponent as ɵb, SkyDockDomAdapterService as ɵc, SkyIdDirective as ɵd, SkyCoreResourcesModule as ɵe, SkyCoreResourcesProvider as ɵf, SkyOverlayComponent as ɵg, SkyOverlayContext as ɵh, SkyOverlayAdapterService as ɵi, SkyViewkeeperDirective as ɵj };
3105
+ export { MutationObserverService, NumericOptions, SkyAffixAutoFitContext, SkyAffixModule, SkyAffixService, SkyAffixer, SkyAppFormat, SkyAppTitleService, SkyAppWindowRef, SkyCoreAdapterModule, SkyCoreAdapterService, SkyDockItem, SkyDockLocation, SkyDockModule, SkyDockService, SkyDynamicComponentLocation, SkyDynamicComponentModule, SkyDynamicComponentService, SkyIdModule, SkyLogModule, SkyLogService, SkyMediaBreakpoints, SkyMediaQueryModule, SkyMediaQueryService, SkyNumericModule, SkyNumericPipe, SkyNumericService, SkyOverlayInstance, SkyOverlayModule, SkyOverlayService, SkyPercentPipe, SkyPercentPipeModule, SkyScrollableHostService, SkyUIConfigService, SkyViewkeeperHostOptions, SkyViewkeeperModule, SkyViewkeeperService, getWindow, SkyAffixDirective as ɵa, SkyDockComponent as ɵb, SkyDockDomAdapterService as ɵc, SkyIdDirective as ɵd, SkyCoreResourcesModule as ɵe, SkyCoreResourcesProvider as ɵf, SkyOverlayComponent as ɵg, SkyOverlayContext as ɵh, SkyOverlayAdapterService as ɵi, SkyViewkeeperDirective as ɵj, SkyScrollableHostModule as ɵk };
2986
3106
  //# sourceMappingURL=skyux-core.js.map