@skyux/core 4.7.0 → 4.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/bundles/skyux-core.umd.js +246 -39
  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-dom-adapter.service.js +60 -3
  7. package/esm2015/modules/dock/dock.component.js +13 -4
  8. package/esm2015/modules/numeric/numeric.options.js +6 -1
  9. package/esm2015/modules/numeric/numeric.service.js +2 -2
  10. package/esm2015/modules/scrollable-host/scrollable-host.module.js +16 -0
  11. package/esm2015/modules/scrollable-host/scrollable-host.service.js +89 -0
  12. package/esm2015/modules/shared/number-format/number-format-utility.js +4 -3
  13. package/esm2015/modules/viewkeeper/viewkeeper-host-options.js +1 -1
  14. package/esm2015/modules/viewkeeper/viewkeeper-options.js +1 -1
  15. package/esm2015/modules/viewkeeper/viewkeeper.directive.js +35 -16
  16. package/esm2015/modules/viewkeeper/viewkeeper.js +27 -11
  17. package/esm2015/modules/viewkeeper/viewkeeper.module.js +5 -1
  18. package/esm2015/public_api.js +2 -1
  19. package/esm2015/skyux-core.js +2 -1
  20. package/esm5/modules/dock/dock-dom-adapter.service.js +61 -3
  21. package/esm5/modules/dock/dock.component.js +13 -4
  22. package/esm5/modules/numeric/numeric.options.js +6 -1
  23. package/esm5/modules/numeric/numeric.service.js +2 -2
  24. package/esm5/modules/scrollable-host/scrollable-host.module.js +19 -0
  25. package/esm5/modules/scrollable-host/scrollable-host.service.js +91 -0
  26. package/esm5/modules/shared/number-format/number-format-utility.js +4 -3
  27. package/esm5/modules/viewkeeper/viewkeeper-host-options.js +1 -1
  28. package/esm5/modules/viewkeeper/viewkeeper-options.js +1 -1
  29. package/esm5/modules/viewkeeper/viewkeeper.directive.js +45 -25
  30. package/esm5/modules/viewkeeper/viewkeeper.js +31 -11
  31. package/esm5/modules/viewkeeper/viewkeeper.module.js +5 -1
  32. package/esm5/public_api.js +2 -1
  33. package/esm5/skyux-core.js +2 -1
  34. package/fesm2015/skyux-core.js +226 -32
  35. package/fesm2015/skyux-core.js.map +1 -1
  36. package/fesm5/skyux-core.js +246 -41
  37. package/fesm5/skyux-core.js.map +1 -1
  38. package/modules/dock/dock-dom-adapter.service.d.ts +14 -3
  39. package/modules/numeric/numeric.options.d.ts +5 -0
  40. package/modules/scrollable-host/scrollable-host.module.d.ts +2 -0
  41. package/modules/scrollable-host/scrollable-host.service.d.ts +13 -0
  42. package/modules/shared/number-format/number-format-utility.d.ts +1 -1
  43. package/modules/viewkeeper/viewkeeper-host-options.d.ts +1 -0
  44. package/modules/viewkeeper/viewkeeper-options.d.ts +5 -0
  45. package/modules/viewkeeper/viewkeeper.d.ts +4 -1
  46. package/modules/viewkeeper/viewkeeper.directive.d.ts +4 -1
  47. package/package.json +2 -2
  48. package/public_api.d.ts +1 -0
  49. package/skyux-core.d.ts +1 -0
  50. package/skyux-core.metadata.json +1 -1
@@ -28,10 +28,11 @@ export * from './modules/overlay/overlay.module';
28
28
  export * from './modules/overlay/overlay.service';
29
29
  export * from './modules/percent-pipe/percent-pipe.module';
30
30
  export * from './modules/percent-pipe/percent.pipe';
31
+ export * from './modules/scrollable-host/scrollable-host.service';
31
32
  export * from './modules/title/title.service';
32
33
  export * from './modules/ui-config/ui-config.service';
33
34
  export * from './modules/viewkeeper/viewkeeper-host-options';
34
35
  export * from './modules/viewkeeper/viewkeeper.module';
35
36
  export * from './modules/viewkeeper/viewkeeper.service';
36
37
  export * from './modules/window/window-ref';
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bza3l1eC9jb3JlLyIsInNvdXJjZXMiOlsicHVibGljX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsMkNBQTJDLENBQUM7QUFHMUQsY0FBYyx3Q0FBd0MsQ0FBQztBQVF2RCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyx5QkFBeUIsQ0FBQztBQUd4QyxjQUFjLDBCQUEwQixDQUFDO0FBRXpDLGNBQWMsOEJBQThCLENBQUM7QUFFN0MsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDO0FBRTVDLGNBQWMsd0RBQXdELENBQUM7QUFFdkUsY0FBYyxzREFBc0QsQ0FBQztBQUNyRSxjQUFjLHVEQUF1RCxDQUFDO0FBRXRFLGNBQWMsNkJBQTZCLENBQUM7QUFFNUMsY0FBYyx3QkFBd0IsQ0FBQztBQUV2QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsMkJBQTJCLENBQUM7QUFFMUMsY0FBYyx5Q0FBeUMsQ0FBQztBQUV4RCxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsMkNBQTJDLENBQUM7QUFFMUQsY0FBYyw4Q0FBOEMsQ0FBQztBQUc3RCxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLG1DQUFtQyxDQUFDO0FBR2xELGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLG1DQUFtQyxDQUFDO0FBRWxELGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyxxQ0FBcUMsQ0FBQztBQUdwRCxjQUFjLCtCQUErQixDQUFDO0FBRTlDLGNBQWMsdUNBQXVDLENBQUM7QUFFdEQsY0FBYyw4Q0FBOEMsQ0FBQztBQUU3RCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMseUNBQXlDLENBQUM7QUFFeEQsY0FBYyw2QkFBNkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9hZGFwdGVyLXNlcnZpY2UvYWRhcHRlci5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FkYXB0ZXItc2VydmljZS9hZGFwdGVyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FkYXB0ZXItc2VydmljZS9mb2N1c2FibGUtY2hpbGRyZW4tb3B0aW9ucyc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9hZmZpeC9hZmZpeC1hdXRvLWZpdC1jb250ZXh0JztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9hZmZpeC9hZmZpeC1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FmZml4L2FmZml4LWhvcml6b250YWwtYWxpZ25tZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9hZmZpeC9hZmZpeC1vZmZzZXQnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FmZml4L2FmZml4LW9mZnNldC1jaGFuZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FmZml4L2FmZml4LXBsYWNlbWVudCc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvYWZmaXgvYWZmaXgtcGxhY2VtZW50LWNoYW5nZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvYWZmaXgvYWZmaXgtdmVydGljYWwtYWxpZ25tZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9hZmZpeC9hZmZpeC5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FmZml4L2FmZml4LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FmZml4L2FmZml4ZXInO1xuXG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvZG9jay9kb2NrLWluc2VydC1jb21wb25lbnQtY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9kb2NrL2RvY2staXRlbSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvZG9jay9kb2NrLWl0ZW0tY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9kb2NrL2RvY2stbG9jYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2RvY2svZG9jay1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9kb2NrL2RvY2subW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9kb2NrL2RvY2suc2VydmljZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9keW5hbWljLWNvbXBvbmVudC9keW5hbWljLWNvbXBvbmVudC1sb2NhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvZHluYW1pYy1jb21wb25lbnQvZHluYW1pYy1jb21wb25lbnQtb3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvZHluYW1pYy1jb21wb25lbnQvZHluYW1pYy1jb21wb25lbnQubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9keW5hbWljLWNvbXBvbmVudC9keW5hbWljLWNvbXBvbmVudC5zZXJ2aWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2Zvcm1hdC9hcHAtZm9ybWF0JztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2lkL2lkLm1vZHVsZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9sb2cvbG9nLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvbG9nL2xvZy5zZXJ2aWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL21lZGlhLXF1ZXJ5L21lZGlhLWJyZWFrcG9pbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9tZWRpYS1xdWVyeS9tZWRpYS1xdWVyeS1saXN0ZW5lcic7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvbWVkaWEtcXVlcnkvbWVkaWEtcXVlcnkubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9tZWRpYS1xdWVyeS9tZWRpYS1xdWVyeS5zZXJ2aWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL211dGF0aW9uL211dGF0aW9uLW9ic2VydmVyLXNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvbnVtZXJpYy9udW1lcmljLXN5bWJvbCc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvbnVtZXJpYy9udW1lcmljLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvbnVtZXJpYy9udW1lcmljLm9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL251bWVyaWMvbnVtZXJpYy5waXBlJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9udW1lcmljL251bWVyaWMuc2VydmljZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9vdmVybGF5L292ZXJsYXktY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9vdmVybGF5L292ZXJsYXktaW5zdGFuY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL292ZXJsYXkvb3ZlcmxheS5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL292ZXJsYXkvb3ZlcmxheS5zZXJ2aWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL3BlcmNlbnQtcGlwZS9wZXJjZW50LXBpcGUubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9wZXJjZW50LXBpcGUvcGVyY2VudC5waXBlJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL3RpdGxlL3NldC10aXRsZS1hcmdzJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy90aXRsZS90aXRsZS5zZXJ2aWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL3VpLWNvbmZpZy91aS1jb25maWcuc2VydmljZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy92aWV3a2VlcGVyL3ZpZXdrZWVwZXItaG9zdC1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy92aWV3a2VlcGVyL3ZpZXdrZWVwZXItb3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvdmlld2tlZXBlci92aWV3a2VlcGVyLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvdmlld2tlZXBlci92aWV3a2VlcGVyLnNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvd2luZG93L3dpbmRvdy1yZWYnO1xuIl19
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bza3l1eC9jb3JlLyIsInNvdXJjZXMiOlsicHVibGljX2FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsMkNBQTJDLENBQUM7QUFHMUQsY0FBYyx3Q0FBd0MsQ0FBQztBQVF2RCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyx5QkFBeUIsQ0FBQztBQUd4QyxjQUFjLDBCQUEwQixDQUFDO0FBRXpDLGNBQWMsOEJBQThCLENBQUM7QUFFN0MsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDZCQUE2QixDQUFDO0FBRTVDLGNBQWMsd0RBQXdELENBQUM7QUFFdkUsY0FBYyxzREFBc0QsQ0FBQztBQUNyRSxjQUFjLHVEQUF1RCxDQUFDO0FBRXRFLGNBQWMsNkJBQTZCLENBQUM7QUFFNUMsY0FBYyx3QkFBd0IsQ0FBQztBQUV2QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsMkJBQTJCLENBQUM7QUFFMUMsY0FBYyx5Q0FBeUMsQ0FBQztBQUV4RCxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsMkNBQTJDLENBQUM7QUFFMUQsY0FBYyw4Q0FBOEMsQ0FBQztBQUc3RCxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLG1DQUFtQyxDQUFDO0FBR2xELGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLG1DQUFtQyxDQUFDO0FBRWxELGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyxxQ0FBcUMsQ0FBQztBQUVwRCxjQUFjLG1EQUFtRCxDQUFDO0FBR2xFLGNBQWMsK0JBQStCLENBQUM7QUFFOUMsY0FBYyx1Q0FBdUMsQ0FBQztBQUV0RCxjQUFjLDhDQUE4QyxDQUFDO0FBRTdELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsY0FBYyx5Q0FBeUMsQ0FBQztBQUV4RCxjQUFjLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FkYXB0ZXItc2VydmljZS9hZGFwdGVyLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvYWRhcHRlci1zZXJ2aWNlL2FkYXB0ZXIuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvYWRhcHRlci1zZXJ2aWNlL2ZvY3VzYWJsZS1jaGlsZHJlbi1vcHRpb25zJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FmZml4L2FmZml4LWF1dG8tZml0LWNvbnRleHQnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FmZml4L2FmZml4LWNvbmZpZyc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvYWZmaXgvYWZmaXgtaG9yaXpvbnRhbC1hbGlnbm1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FmZml4L2FmZml4LW9mZnNldCc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvYWZmaXgvYWZmaXgtb2Zmc2V0LWNoYW5nZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvYWZmaXgvYWZmaXgtcGxhY2VtZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9hZmZpeC9hZmZpeC1wbGFjZW1lbnQtY2hhbmdlJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9hZmZpeC9hZmZpeC12ZXJ0aWNhbC1hbGlnbm1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2FmZml4L2FmZml4Lm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvYWZmaXgvYWZmaXguc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvYWZmaXgvYWZmaXhlcic7XG5cbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9kb2NrL2RvY2staW5zZXJ0LWNvbXBvbmVudC1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2RvY2svZG9jay1pdGVtJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9kb2NrL2RvY2staXRlbS1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2RvY2svZG9jay1sb2NhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvZG9jay9kb2NrLW9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2RvY2svZG9jay5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2RvY2svZG9jay5zZXJ2aWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2R5bmFtaWMtY29tcG9uZW50L2R5bmFtaWMtY29tcG9uZW50LWxvY2F0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9keW5hbWljLWNvbXBvbmVudC9keW5hbWljLWNvbXBvbmVudC1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9keW5hbWljLWNvbXBvbmVudC9keW5hbWljLWNvbXBvbmVudC5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2R5bmFtaWMtY29tcG9uZW50L2R5bmFtaWMtY29tcG9uZW50LnNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvZm9ybWF0L2FwcC1mb3JtYXQnO1xuXG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvaWQvaWQubW9kdWxlJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL2xvZy9sb2cubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9sb2cvbG9nLnNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvbWVkaWEtcXVlcnkvbWVkaWEtYnJlYWtwb2ludHMnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL21lZGlhLXF1ZXJ5L21lZGlhLXF1ZXJ5LWxpc3RlbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9tZWRpYS1xdWVyeS9tZWRpYS1xdWVyeS5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL21lZGlhLXF1ZXJ5L21lZGlhLXF1ZXJ5LnNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvbXV0YXRpb24vbXV0YXRpb24tb2JzZXJ2ZXItc2VydmljZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9udW1lcmljL251bWVyaWMtc3ltYm9sJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9udW1lcmljL251bWVyaWMubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy9udW1lcmljL251bWVyaWMub3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvbnVtZXJpYy9udW1lcmljLnBpcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL251bWVyaWMvbnVtZXJpYy5zZXJ2aWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL292ZXJsYXkvb3ZlcmxheS1jb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL292ZXJsYXkvb3ZlcmxheS1pbnN0YW5jZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvb3ZlcmxheS9vdmVybGF5Lm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvb3ZlcmxheS9vdmVybGF5LnNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvcGVyY2VudC1waXBlL3BlcmNlbnQtcGlwZS5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL3BlcmNlbnQtcGlwZS9wZXJjZW50LnBpcGUnO1xuXG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvc2Nyb2xsYWJsZS1ob3N0L3Njcm9sbGFibGUtaG9zdC5zZXJ2aWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL3RpdGxlL3NldC10aXRsZS1hcmdzJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy90aXRsZS90aXRsZS5zZXJ2aWNlJztcblxuZXhwb3J0ICogZnJvbSAnLi9tb2R1bGVzL3VpLWNvbmZpZy91aS1jb25maWcuc2VydmljZSc7XG5cbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy92aWV3a2VlcGVyL3ZpZXdrZWVwZXItaG9zdC1vcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcy92aWV3a2VlcGVyL3ZpZXdrZWVwZXItb3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvdmlld2tlZXBlci92aWV3a2VlcGVyLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvdmlld2tlZXBlci92aWV3a2VlcGVyLnNlcnZpY2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL21vZHVsZXMvd2luZG93L3dpbmRvdy1yZWYnO1xuIl19
@@ -9,7 +9,8 @@ export { SkyIdDirective as ɵd } from './modules/id/id.directive';
9
9
  export { SkyOverlayAdapterService as ɵi } from './modules/overlay/overlay-adapter.service';
10
10
  export { SkyOverlayContext as ɵh } from './modules/overlay/overlay-context';
11
11
  export { SkyOverlayComponent as ɵg } from './modules/overlay/overlay.component';
12
+ export { SkyScrollableHostModule as ɵk } from './modules/scrollable-host/scrollable-host.module';
12
13
  export { SkyCoreResourcesModule as ɵe } from './modules/shared/core-resources.module';
13
14
  export { SkyViewkeeperDirective as ɵj } from './modules/viewkeeper/viewkeeper.directive';
14
15
  export { SkyCoreResourcesProvider as ɵf } from './plugin-resources/core-resources-provider';
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2t5dXgtY29yZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bza3l1eC9jb3JlLyIsInNvdXJjZXMiOlsic2t5dXgtY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDO0FBRTdCLE9BQU8sRUFBQyxpQkFBaUIsSUFBSSxFQUFFLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUMsd0JBQXdCLElBQUksRUFBRSxFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDdkYsT0FBTyxFQUFDLGdCQUFnQixJQUFJLEVBQUUsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxjQUFjLElBQUksRUFBRSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFDLHdCQUF3QixJQUFJLEVBQUUsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxpQkFBaUIsSUFBSSxFQUFFLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsbUJBQW1CLElBQUksRUFBRSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDOUUsT0FBTyxFQUFDLHNCQUFzQixJQUFJLEVBQUUsRUFBQyxNQUFNLHdDQUF3QyxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxzQkFBc0IsSUFBSSxFQUFFLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUN2RixPQUFPLEVBQUMsd0JBQXdCLElBQUksRUFBRSxFQUFDLE1BQU0sNENBQTRDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmVyYXRlZCBidW5kbGUgaW5kZXguIERvIG5vdCBlZGl0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vcHVibGljX2FwaSc7XG5cbmV4cG9ydCB7U2t5QWZmaXhEaXJlY3RpdmUgYXMgybVhfSBmcm9tICcuL21vZHVsZXMvYWZmaXgvYWZmaXguZGlyZWN0aXZlJztcbmV4cG9ydCB7U2t5RG9ja0RvbUFkYXB0ZXJTZXJ2aWNlIGFzIMm1Y30gZnJvbSAnLi9tb2R1bGVzL2RvY2svZG9jay1kb20tYWRhcHRlci5zZXJ2aWNlJztcbmV4cG9ydCB7U2t5RG9ja0NvbXBvbmVudCBhcyDJtWJ9IGZyb20gJy4vbW9kdWxlcy9kb2NrL2RvY2suY29tcG9uZW50JztcbmV4cG9ydCB7U2t5SWREaXJlY3RpdmUgYXMgybVkfSBmcm9tICcuL21vZHVsZXMvaWQvaWQuZGlyZWN0aXZlJztcbmV4cG9ydCB7U2t5T3ZlcmxheUFkYXB0ZXJTZXJ2aWNlIGFzIMm1aX0gZnJvbSAnLi9tb2R1bGVzL292ZXJsYXkvb3ZlcmxheS1hZGFwdGVyLnNlcnZpY2UnO1xuZXhwb3J0IHtTa3lPdmVybGF5Q29udGV4dCBhcyDJtWh9IGZyb20gJy4vbW9kdWxlcy9vdmVybGF5L292ZXJsYXktY29udGV4dCc7XG5leHBvcnQge1NreU92ZXJsYXlDb21wb25lbnQgYXMgybVnfSBmcm9tICcuL21vZHVsZXMvb3ZlcmxheS9vdmVybGF5LmNvbXBvbmVudCc7XG5leHBvcnQge1NreUNvcmVSZXNvdXJjZXNNb2R1bGUgYXMgybVlfSBmcm9tICcuL21vZHVsZXMvc2hhcmVkL2NvcmUtcmVzb3VyY2VzLm1vZHVsZSc7XG5leHBvcnQge1NreVZpZXdrZWVwZXJEaXJlY3RpdmUgYXMgybVqfSBmcm9tICcuL21vZHVsZXMvdmlld2tlZXBlci92aWV3a2VlcGVyLmRpcmVjdGl2ZSc7XG5leHBvcnQge1NreUNvcmVSZXNvdXJjZXNQcm92aWRlciBhcyDJtWZ9IGZyb20gJy4vcGx1Z2luLXJlc291cmNlcy9jb3JlLXJlc291cmNlcy1wcm92aWRlcic7Il19
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2t5dXgtY29yZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bza3l1eC9jb3JlLyIsInNvdXJjZXMiOlsic2t5dXgtY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDO0FBRTdCLE9BQU8sRUFBQyxpQkFBaUIsSUFBSSxFQUFFLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUMsd0JBQXdCLElBQUksRUFBRSxFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFDdkYsT0FBTyxFQUFDLGdCQUFnQixJQUFJLEVBQUUsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3JFLE9BQU8sRUFBQyxjQUFjLElBQUksRUFBRSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFDLHdCQUF3QixJQUFJLEVBQUUsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxpQkFBaUIsSUFBSSxFQUFFLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsbUJBQW1CLElBQUksRUFBRSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDOUUsT0FBTyxFQUFDLHVCQUF1QixJQUFJLEVBQUUsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQy9GLE9BQU8sRUFBQyxzQkFBc0IsSUFBSSxFQUFFLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUNwRixPQUFPLEVBQUMsc0JBQXNCLElBQUksRUFBRSxFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDdkYsT0FBTyxFQUFDLHdCQUF3QixJQUFJLEVBQUUsRUFBQyxNQUFNLDRDQUE0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpY19hcGknO1xuXG5leHBvcnQge1NreUFmZml4RGlyZWN0aXZlIGFzIMm1YX0gZnJvbSAnLi9tb2R1bGVzL2FmZml4L2FmZml4LmRpcmVjdGl2ZSc7XG5leHBvcnQge1NreURvY2tEb21BZGFwdGVyU2VydmljZSBhcyDJtWN9IGZyb20gJy4vbW9kdWxlcy9kb2NrL2RvY2stZG9tLWFkYXB0ZXIuc2VydmljZSc7XG5leHBvcnQge1NreURvY2tDb21wb25lbnQgYXMgybVifSBmcm9tICcuL21vZHVsZXMvZG9jay9kb2NrLmNvbXBvbmVudCc7XG5leHBvcnQge1NreUlkRGlyZWN0aXZlIGFzIMm1ZH0gZnJvbSAnLi9tb2R1bGVzL2lkL2lkLmRpcmVjdGl2ZSc7XG5leHBvcnQge1NreU92ZXJsYXlBZGFwdGVyU2VydmljZSBhcyDJtWl9IGZyb20gJy4vbW9kdWxlcy9vdmVybGF5L292ZXJsYXktYWRhcHRlci5zZXJ2aWNlJztcbmV4cG9ydCB7U2t5T3ZlcmxheUNvbnRleHQgYXMgybVofSBmcm9tICcuL21vZHVsZXMvb3ZlcmxheS9vdmVybGF5LWNvbnRleHQnO1xuZXhwb3J0IHtTa3lPdmVybGF5Q29tcG9uZW50IGFzIMm1Z30gZnJvbSAnLi9tb2R1bGVzL292ZXJsYXkvb3ZlcmxheS5jb21wb25lbnQnO1xuZXhwb3J0IHtTa3lTY3JvbGxhYmxlSG9zdE1vZHVsZSBhcyDJtWt9IGZyb20gJy4vbW9kdWxlcy9zY3JvbGxhYmxlLWhvc3Qvc2Nyb2xsYWJsZS1ob3N0Lm1vZHVsZSc7XG5leHBvcnQge1NreUNvcmVSZXNvdXJjZXNNb2R1bGUgYXMgybVlfSBmcm9tICcuL21vZHVsZXMvc2hhcmVkL2NvcmUtcmVzb3VyY2VzLm1vZHVsZSc7XG5leHBvcnQge1NreVZpZXdrZWVwZXJEaXJlY3RpdmUgYXMgybVqfSBmcm9tICcuL21vZHVsZXMvdmlld2tlZXBlci92aWV3a2VlcGVyLmRpcmVjdGl2ZSc7XG5leHBvcnQge1NreUNvcmVSZXNvdXJjZXNQcm92aWRlciBhcyDJtWZ9IGZyb20gJy4vcGx1Z2luLXJlc291cmNlcy9jb3JlLXJlc291cmNlcy1wcm92aWRlcic7Il19
@@ -2,7 +2,7 @@ import { __decorate, __param } 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 } 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';
@@ -1047,17 +1047,71 @@ MutationObserverService = __decorate([
1047
1047
  * @internal
1048
1048
  */
1049
1049
  let SkyDockDomAdapterService = class SkyDockDomAdapterService {
1050
- constructor(rendererFactory) {
1050
+ constructor(mutationService, rendererFactory) {
1051
+ this.mutationService = mutationService;
1052
+ this.ngUnsubscribe = new Subject();
1051
1053
  this.renderer = rendererFactory.createRenderer(undefined, undefined);
1052
1054
  }
1055
+ ngOnDestroy() {
1056
+ if (this.observer) {
1057
+ this.observer.disconnect();
1058
+ }
1059
+ this.ngUnsubscribe.next();
1060
+ if (this.styleElement) {
1061
+ this.destroyStyleElement();
1062
+ }
1063
+ this.currentDockHeight =
1064
+ this.ngUnsubscribe =
1065
+ this.observer =
1066
+ this.styleElement = undefined;
1067
+ }
1068
+ setSticky(elementRef) {
1069
+ this.renderer.addClass(elementRef.nativeElement, 'sky-dock-sticky');
1070
+ }
1053
1071
  setZIndex(zIndex, elementRef) {
1054
1072
  this.renderer.setStyle(elementRef.nativeElement, 'z-index', zIndex);
1055
1073
  }
1056
1074
  unbindDock(elementRef) {
1057
1075
  this.renderer.addClass(elementRef.nativeElement, 'sky-dock-unbound');
1058
1076
  }
1077
+ watchDomChanges(elementRef) {
1078
+ this.observer = this.mutationService.create(() => {
1079
+ this.adjustBodyStyles(elementRef);
1080
+ });
1081
+ this.observer.observe(elementRef.nativeElement, {
1082
+ attributes: true,
1083
+ childList: true,
1084
+ characterData: true,
1085
+ subtree: true
1086
+ });
1087
+ fromEvent(window, 'resize')
1088
+ .pipe(debounceTime(250), takeUntil(this.ngUnsubscribe))
1089
+ .subscribe(() => this.adjustBodyStyles(elementRef));
1090
+ }
1091
+ adjustBodyStyles(elementRef) {
1092
+ const dockHeight = elementRef.nativeElement.getBoundingClientRect().height;
1093
+ if (dockHeight === this.currentDockHeight) {
1094
+ return;
1095
+ }
1096
+ // Create a style element to avoid overwriting any existing inline body styles.
1097
+ const styleElement = this.renderer.createElement('style');
1098
+ const textNode = this.renderer.createText(`body { margin-bottom: ${dockHeight}px; }`);
1099
+ // Apply a `data-` attribute to make unit testing easier.
1100
+ this.renderer.setAttribute(styleElement, 'data-test-selector', 'sky-layout-dock-bottom-styles');
1101
+ this.renderer.appendChild(styleElement, textNode);
1102
+ this.renderer.appendChild(document.head, styleElement);
1103
+ if (this.styleElement) {
1104
+ this.destroyStyleElement();
1105
+ }
1106
+ this.currentDockHeight = dockHeight;
1107
+ this.styleElement = styleElement;
1108
+ }
1109
+ destroyStyleElement() {
1110
+ this.renderer.removeChild(document.head, this.styleElement);
1111
+ }
1059
1112
  };
1060
1113
  SkyDockDomAdapterService.ctorParameters = () => [
1114
+ { type: MutationObserverService },
1061
1115
  { type: RendererFactory2 }
1062
1116
  ];
1063
1117
  SkyDockDomAdapterService = __decorate([
@@ -1119,8 +1173,17 @@ let SkyDockComponent = class SkyDockComponent {
1119
1173
  setOptions(options) {
1120
1174
  var _a, _b;
1121
1175
  this.options = options;
1122
- if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.location) === SkyDockLocation.BeforeElement) {
1123
- this.domAdapter.unbindDock(this.elementRef);
1176
+ switch ((_a = this.options) === null || _a === void 0 ? void 0 : _a.location) {
1177
+ case SkyDockLocation.BeforeElement:
1178
+ this.domAdapter.unbindDock(this.elementRef);
1179
+ break;
1180
+ case SkyDockLocation.ElementBottom:
1181
+ this.domAdapter.setSticky(this.elementRef);
1182
+ break;
1183
+ case SkyDockLocation.BodyBottom:
1184
+ default:
1185
+ this.domAdapter.watchDomChanges(this.elementRef);
1186
+ break;
1124
1187
  }
1125
1188
  if ((_b = this.options) === null || _b === void 0 ? void 0 : _b.zIndex) {
1126
1189
  this.domAdapter.setZIndex(this.options.zIndex, this.elementRef);
@@ -1159,7 +1222,7 @@ SkyDockComponent = __decorate([
1159
1222
  SkyDockDomAdapterService
1160
1223
  ],
1161
1224
  changeDetection: ChangeDetectionStrategy.OnPush,
1162
- styles: [":host{display:flex;flex-direction:column;width:100%}:host:not(.sky-dock-unbound){position:sticky;left:0;bottom:0;right:0}"]
1225
+ 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}"]
1163
1226
  })
1164
1227
  ], SkyDockComponent);
1165
1228
 
@@ -1516,7 +1579,7 @@ function parseIntAutoRadix(text) {
1516
1579
  class SkyNumberFormatUtility {
1517
1580
  /* istanbul ignore next */
1518
1581
  constructor() { }
1519
- static formatNumber(locale, value, style, digits, currency = null, currencyAsSymbol = false) {
1582
+ static formatNumber(locale, value, style, digits, currency = null, currencyAsSymbol = false, currencySign) {
1520
1583
  if (value == null) {
1521
1584
  return null;
1522
1585
  }
@@ -1557,7 +1620,8 @@ class SkyNumberFormatUtility {
1557
1620
  minimumFractionDigits: minFraction,
1558
1621
  maximumFractionDigits: maxFraction,
1559
1622
  currency: currency,
1560
- currencyAsSymbol: currencyAsSymbol
1623
+ currencyAsSymbol: currencyAsSymbol,
1624
+ currencySign: currencySign
1561
1625
  });
1562
1626
  }
1563
1627
  }
@@ -1641,7 +1705,7 @@ let SkyNumericService = class SkyNumericService {
1641
1705
  // and the appropriate string value for Angular 5+.
1642
1706
  // See: https://angular.io/api/common/CurrencyPipe#parameters
1643
1707
  const symbolDisplay = 'symbol';
1644
- output = SkyNumberFormatUtility.formatNumber(locale, parseFloat(output), SkyIntlNumberFormatStyle.Currency, digits, options.iso, symbolDisplay);
1708
+ output = SkyNumberFormatUtility.formatNumber(locale, parseFloat(output), SkyIntlNumberFormatStyle.Currency, digits, options.iso, symbolDisplay, options.currencySign);
1645
1709
  break;
1646
1710
  // The following is a catch-all to ensure that if
1647
1711
  // anything but currency (or a future option) are entered,
@@ -1758,6 +1822,11 @@ class NumericOptions {
1758
1822
  * @default "number"
1759
1823
  */
1760
1824
  this.format = 'number';
1825
+ /**
1826
+ * Specifies the format of the currency`.
1827
+ * @default "standard"
1828
+ */
1829
+ this.currencySign = 'standard';
1761
1830
  /**
1762
1831
  * Specifies the ISO4217 currency code to use for currency formatting. If you do not specify a
1763
1832
  * currency code, the component uses the browser's culture to determine the currency unless your
@@ -2304,6 +2373,85 @@ SkyPercentPipeModule = __decorate([
2304
2373
  })
2305
2374
  ], SkyPercentPipeModule);
2306
2375
 
2376
+ let SkyScrollableHostService = class SkyScrollableHostService {
2377
+ constructor(mutationObserverSvc, windowRef) {
2378
+ this.mutationObserverSvc = mutationObserverSvc;
2379
+ this.windowRef = windowRef;
2380
+ }
2381
+ getScrollabeHost(elementRef) {
2382
+ return this.findScrollableHost(elementRef.nativeElement);
2383
+ }
2384
+ watchScrollableHost(elementRef, completionObservable) {
2385
+ let scrollableHost = this.findScrollableHost(elementRef.nativeElement);
2386
+ let behaviorSubject = new BehaviorSubject(scrollableHost);
2387
+ const mutationObserver = this.mutationObserverSvc.create(() => {
2388
+ let newScrollableHost = this.findScrollableHost(elementRef.nativeElement);
2389
+ if (newScrollableHost !== scrollableHost) {
2390
+ scrollableHost = newScrollableHost;
2391
+ this.observeForScrollableHostChanges(scrollableHost, mutationObserver);
2392
+ behaviorSubject.next(scrollableHost);
2393
+ }
2394
+ });
2395
+ this.observeForScrollableHostChanges(scrollableHost, mutationObserver);
2396
+ completionObservable.pipe(take(1)).subscribe(() => {
2397
+ mutationObserver.disconnect();
2398
+ });
2399
+ return behaviorSubject;
2400
+ }
2401
+ findScrollableHost(element) {
2402
+ const regex = /(auto|scroll)/;
2403
+ const windowObj = this.windowRef.nativeWindow;
2404
+ const bodyObj = windowObj.document.body;
2405
+ /* Sanity check */
2406
+ if (!element) {
2407
+ return windowObj;
2408
+ }
2409
+ let style = windowObj.getComputedStyle(element);
2410
+ let parent = element;
2411
+ do {
2412
+ parent = parent.parentNode;
2413
+ /* Sanity check for if this function is called for an element which has been removed from the DOM */
2414
+ if (!(parent instanceof HTMLElement)) {
2415
+ return windowObj;
2416
+ }
2417
+ style = windowObj.getComputedStyle(parent);
2418
+ } while (!regex.test(style.overflow) &&
2419
+ !regex.test(style.overflowY) &&
2420
+ parent !== bodyObj);
2421
+ if (parent === bodyObj) {
2422
+ return windowObj;
2423
+ }
2424
+ return parent;
2425
+ }
2426
+ observeForScrollableHostChanges(element, mutationObserver) {
2427
+ mutationObserver.disconnect();
2428
+ if (element instanceof HTMLElement) {
2429
+ mutationObserver.observe(element, {
2430
+ attributes: true,
2431
+ attributeFilter: ['class', 'style.overflow', 'style.overflow-y'],
2432
+ subtree: true
2433
+ });
2434
+ }
2435
+ else {
2436
+ mutationObserver.observe(document.documentElement, {
2437
+ attributes: true,
2438
+ attributeFilter: ['class', 'style.overflow', 'style.overflow-y'],
2439
+ subtree: true
2440
+ });
2441
+ }
2442
+ }
2443
+ };
2444
+ SkyScrollableHostService.ctorParameters = () => [
2445
+ { type: MutationObserverService },
2446
+ { type: SkyAppWindowRef }
2447
+ ];
2448
+ SkyScrollableHostService.ɵprov = ɵɵdefineInjectable({ factory: function SkyScrollableHostService_Factory() { return new SkyScrollableHostService(ɵɵinject(MutationObserverService), ɵɵinject(SkyAppWindowRef)); }, token: SkyScrollableHostService, providedIn: "root" });
2449
+ SkyScrollableHostService = __decorate([
2450
+ Injectable({
2451
+ providedIn: 'root'
2452
+ })
2453
+ ], SkyScrollableHostService);
2454
+
2307
2455
  /**
2308
2456
  * Provides a method for setting a formatted title on the current window.
2309
2457
  */
@@ -2376,11 +2524,12 @@ function nextId() {
2376
2524
  nextIdIndex = (nextIdIndex || 0) + 1;
2377
2525
  return 'viewkeeper-' + nextIdIndex;
2378
2526
  }
2379
- function getOffset(el) {
2527
+ function getOffset(el, scrollableHost) {
2380
2528
  const rect = el.getBoundingClientRect();
2529
+ const parent = scrollableHost ? scrollableHost : document.documentElement;
2381
2530
  return {
2382
- top: rect.top + document.documentElement.scrollTop,
2383
- left: rect.left + document.documentElement.scrollLeft
2531
+ top: rect.top + parent.scrollTop,
2532
+ left: rect.left + parent.scrollLeft
2384
2533
  };
2385
2534
  }
2386
2535
  function px(value) {
@@ -2416,6 +2565,7 @@ class SkyViewkeeper {
2416
2565
  this.id = nextId();
2417
2566
  this.el = options.el;
2418
2567
  this.boundaryEl = options.boundaryEl;
2568
+ this.scrollableHost = options.scrollableHost;
2419
2569
  this.verticalOffset = options.verticalOffset || 0;
2420
2570
  this.verticalOffsetEl = options.verticalOffsetEl;
2421
2571
  this.viewportMarginTop = options.viewportMarginTop || 0;
@@ -2423,12 +2573,23 @@ class SkyViewkeeper {
2423
2573
  if (this.verticalOffsetEl) {
2424
2574
  this.verticalOffsetEl.addEventListener(EVT_AFTER_VIEWKEEPER_SYNC, this.syncElPositionHandler);
2425
2575
  }
2426
- window.addEventListener('scroll', this.syncElPositionHandler);
2576
+ window.addEventListener('scroll', this.syncElPositionHandler, true);
2427
2577
  window.addEventListener('resize', this.syncElPositionHandler);
2428
2578
  window.addEventListener('orientationchange', this.syncElPositionHandler);
2429
2579
  ensureStyleEl();
2430
2580
  this.syncElPosition();
2431
2581
  }
2582
+ set viewportMarginTop(margin) {
2583
+ this._viewportMarginTop = margin;
2584
+ }
2585
+ get viewportMarginTop() {
2586
+ if (this.scrollableHost) {
2587
+ return 0;
2588
+ }
2589
+ else {
2590
+ return this._viewportMarginTop;
2591
+ }
2592
+ }
2432
2593
  syncElPosition() {
2433
2594
  const verticalOffset = this.calculateVerticalOffset();
2434
2595
  // When the element isn't visible, its size can't be calculated, so don't attempt syncing position in this case.
@@ -2451,7 +2612,7 @@ class SkyViewkeeper {
2451
2612
  }
2452
2613
  destroy() {
2453
2614
  if (!this.isDestroyed) {
2454
- window.removeEventListener('scroll', this.syncElPositionHandler);
2615
+ window.removeEventListener('scroll', this.syncElPositionHandler, true);
2455
2616
  window.removeEventListener('resize', this.syncElPositionHandler);
2456
2617
  window.removeEventListener('orientationchange', this.syncElPositionHandler);
2457
2618
  this.unfixEl();
@@ -2489,16 +2650,19 @@ class SkyViewkeeper {
2489
2650
  const verticalOffsetElTop = parseInt(verticalOffsetElTopStyle, 10) || 0;
2490
2651
  offset += (this.verticalOffsetEl.offsetHeight + verticalOffsetElTop);
2491
2652
  }
2653
+ else if (this.scrollableHost) {
2654
+ offset += this.scrollableHost.getBoundingClientRect().top;
2655
+ }
2492
2656
  return offset;
2493
2657
  }
2494
2658
  shouldFixEl(boundaryInfo, verticalOffset) {
2495
2659
  let anchorTop;
2496
2660
  let doFixEl;
2497
2661
  if (boundaryInfo.spacerEl) {
2498
- anchorTop = getOffset(boundaryInfo.spacerEl).top;
2662
+ anchorTop = getOffset(boundaryInfo.spacerEl, this.scrollableHost).top;
2499
2663
  }
2500
2664
  else {
2501
- anchorTop = getOffset(this.el).top;
2665
+ anchorTop = getOffset(this.el, this.scrollableHost).top;
2502
2666
  }
2503
2667
  doFixEl = boundaryInfo.scrollTop + verticalOffset + this.viewportMarginTop > anchorTop;
2504
2668
  return doFixEl;
@@ -2557,11 +2721,11 @@ class SkyViewkeeper {
2557
2721
  const spacerId = this.getSpacerId();
2558
2722
  const spacerEl = document.getElementById(spacerId);
2559
2723
  const boundaryEl = this.boundaryEl;
2560
- const boundaryOffset = getOffset(boundaryEl);
2724
+ const boundaryOffset = getOffset(boundaryEl, this.scrollableHost);
2561
2725
  const boundaryTop = boundaryOffset.top;
2562
2726
  const boundaryBottom = boundaryTop + boundaryEl.getBoundingClientRect().height;
2563
- const scrollLeft = document.documentElement.scrollLeft;
2564
- const scrollTop = document.documentElement.scrollTop;
2727
+ const scrollLeft = this.scrollableHost ? this.scrollableHost.scrollLeft : document.documentElement.scrollLeft;
2728
+ const scrollTop = this.scrollableHost ? this.scrollableHost.scrollTop : document.documentElement.scrollTop;
2565
2729
  const elHeight = getHeightWithMargin(this.el);
2566
2730
  return {
2567
2731
  boundaryBottom,
@@ -2608,11 +2772,13 @@ SkyViewkeeperService = __decorate([
2608
2772
  ], SkyViewkeeperService);
2609
2773
 
2610
2774
  let SkyViewkeeperDirective = class SkyViewkeeperDirective {
2611
- constructor(el, mutationObserverSvc, viewkeeperSvc) {
2775
+ constructor(el, mutationObserverSvc, viewkeeperSvc, scrollableHostService) {
2612
2776
  this.el = el;
2613
2777
  this.mutationObserverSvc = mutationObserverSvc;
2614
2778
  this.viewkeeperSvc = viewkeeperSvc;
2779
+ this.scrollableHostService = scrollableHostService;
2615
2780
  this.viewkeepers = [];
2781
+ this.scrollableHostWatchUnsubscribe = undefined;
2616
2782
  }
2617
2783
  set skyViewkeeper(value) {
2618
2784
  this._skyViewkeeper = value;
@@ -2668,17 +2834,29 @@ let SkyViewkeeperDirective = class SkyViewkeeperDirective {
2668
2834
  detectElements() {
2669
2835
  let viewkeeperEls = this.getViewkeeperEls();
2670
2836
  if (this.viewkeeperElsChanged(viewkeeperEls)) {
2671
- this.destroyViewkeepers();
2672
- let previousViewkeeperEl;
2673
- for (const viewkeeperEl of viewkeeperEls) {
2674
- this.viewkeepers.push(this.viewkeeperSvc.create({
2675
- boundaryEl: this.el.nativeElement,
2676
- el: viewkeeperEl,
2677
- setWidth: true,
2678
- verticalOffsetEl: previousViewkeeperEl
2679
- }));
2680
- previousViewkeeperEl = viewkeeperEl;
2837
+ if (this.scrollableHostWatchUnsubscribe) {
2838
+ this.scrollableHostWatchUnsubscribe.next();
2839
+ this.scrollableHostWatchUnsubscribe = new Subject();
2681
2840
  }
2841
+ else {
2842
+ this.scrollableHostWatchUnsubscribe = new Subject();
2843
+ }
2844
+ this.scrollableHostService.watchScrollableHost(this.el, this.scrollableHostWatchUnsubscribe)
2845
+ .pipe(takeUntil(this.scrollableHostWatchUnsubscribe))
2846
+ .subscribe(scrollableHost => {
2847
+ this.destroyViewkeepers();
2848
+ let previousViewkeeperEl;
2849
+ for (const viewkeeperEl of viewkeeperEls) {
2850
+ this.viewkeepers.push(this.viewkeeperSvc.create({
2851
+ boundaryEl: this.el.nativeElement,
2852
+ scrollableHost: scrollableHost instanceof HTMLElement ? scrollableHost : undefined,
2853
+ el: viewkeeperEl,
2854
+ setWidth: true,
2855
+ verticalOffsetEl: previousViewkeeperEl
2856
+ }));
2857
+ previousViewkeeperEl = viewkeeperEl;
2858
+ }
2859
+ });
2682
2860
  this.currentViewkeeperEls = viewkeeperEls;
2683
2861
  }
2684
2862
  }
@@ -2686,7 +2864,8 @@ let SkyViewkeeperDirective = class SkyViewkeeperDirective {
2686
2864
  SkyViewkeeperDirective.ctorParameters = () => [
2687
2865
  { type: ElementRef },
2688
2866
  { type: MutationObserverService },
2689
- { type: SkyViewkeeperService }
2867
+ { type: SkyViewkeeperService },
2868
+ { type: SkyScrollableHostService, decorators: [{ type: Optional }] }
2690
2869
  ];
2691
2870
  __decorate([
2692
2871
  Input()
@@ -2694,9 +2873,21 @@ __decorate([
2694
2873
  SkyViewkeeperDirective = __decorate([
2695
2874
  Directive({
2696
2875
  selector: '[skyViewkeeper]'
2697
- })
2876
+ }),
2877
+ __param(3, Optional())
2698
2878
  ], SkyViewkeeperDirective);
2699
2879
 
2880
+ let SkyScrollableHostModule = class SkyScrollableHostModule {
2881
+ };
2882
+ SkyScrollableHostModule = __decorate([
2883
+ NgModule({
2884
+ providers: [
2885
+ MutationObserverService,
2886
+ SkyAppWindowRef
2887
+ ]
2888
+ })
2889
+ ], SkyScrollableHostModule);
2890
+
2700
2891
  let SkyViewkeeperModule = class SkyViewkeeperModule {
2701
2892
  };
2702
2893
  SkyViewkeeperModule = __decorate([
@@ -2704,6 +2895,9 @@ SkyViewkeeperModule = __decorate([
2704
2895
  declarations: [
2705
2896
  SkyViewkeeperDirective
2706
2897
  ],
2898
+ imports: [
2899
+ SkyScrollableHostModule
2900
+ ],
2707
2901
  exports: [
2708
2902
  SkyViewkeeperDirective
2709
2903
  ],
@@ -2718,5 +2912,5 @@ SkyViewkeeperModule = __decorate([
2718
2912
  * Generated bundle index. Do not edit.
2719
2913
  */
2720
2914
 
2721
- 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 };
2915
+ 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 };
2722
2916
  //# sourceMappingURL=skyux-core.js.map