@skyux/core 5.2.3 → 5.5.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 +6 -4
- package/bundles/skyux-core-testing.umd.js +6 -6
- package/bundles/skyux-core.umd.js +131 -127
- package/documentation.json +293 -24
- package/esm2015/index.js +60 -0
- package/esm2015/index.js.map +1 -0
- package/esm2015/lib/modules/adapter-service/adapter.module.js +16 -0
- package/esm2015/lib/modules/adapter-service/adapter.module.js.map +1 -0
- package/esm2015/lib/modules/adapter-service/adapter.service.js +218 -0
- package/esm2015/lib/modules/adapter-service/adapter.service.js.map +1 -0
- package/esm2015/lib/modules/adapter-service/focusable-children-options.js +2 -0
- package/esm2015/lib/modules/adapter-service/focusable-children-options.js.map +1 -0
- package/esm2015/lib/modules/affix/affix-auto-fit-context.js +12 -0
- package/esm2015/lib/modules/affix/affix-auto-fit-context.js.map +1 -0
- package/esm2015/lib/modules/affix/affix-config.js +2 -0
- package/esm2015/lib/modules/affix/affix-config.js.map +1 -0
- package/esm2015/lib/modules/affix/affix-horizontal-alignment.js +2 -0
- package/esm2015/lib/modules/affix/affix-horizontal-alignment.js.map +1 -0
- package/esm2015/lib/modules/affix/affix-offset-change.js +2 -0
- package/esm2015/lib/modules/affix/affix-offset-change.js.map +1 -0
- package/esm2015/lib/modules/affix/affix-offset.js +2 -0
- package/esm2015/lib/modules/affix/affix-offset.js.map +1 -0
- package/esm2015/lib/modules/affix/affix-placement-change.js +2 -0
- package/esm2015/lib/modules/affix/affix-placement-change.js.map +1 -0
- package/esm2015/lib/modules/affix/affix-placement.js +2 -0
- package/esm2015/lib/modules/affix/affix-placement.js.map +1 -0
- package/esm2015/lib/modules/affix/affix-utils.js +18 -0
- package/esm2015/lib/modules/affix/affix-utils.js.map +1 -0
- package/esm2015/lib/modules/affix/affix-vertical-alignment.js +2 -0
- package/esm2015/lib/modules/affix/affix-vertical-alignment.js.map +1 -0
- package/esm2015/lib/modules/affix/affix.directive.js +100 -0
- package/esm2015/lib/modules/affix/affix.directive.js.map +1 -0
- package/esm2015/lib/modules/affix/affix.module.js +18 -0
- package/esm2015/lib/modules/affix/affix.module.js.map +1 -0
- package/esm2015/lib/modules/affix/affix.service.js +24 -0
- package/esm2015/lib/modules/affix/affix.service.js.map +1 -0
- package/esm2015/lib/modules/affix/affixer.js +349 -0
- package/esm2015/lib/modules/affix/affixer.js.map +1 -0
- package/esm2015/lib/modules/affix/dom-utils.js +77 -0
- package/esm2015/lib/modules/affix/dom-utils.js.map +1 -0
- package/esm2015/lib/modules/dock/dock-dom-adapter.service.js +80 -0
- package/esm2015/lib/modules/dock/dock-dom-adapter.service.js.map +1 -0
- package/esm2015/lib/modules/dock/dock-insert-component-config.js +2 -0
- package/esm2015/lib/modules/dock/dock-insert-component-config.js.map +1 -0
- package/esm2015/lib/modules/dock/dock-item-config.js +2 -0
- package/esm2015/lib/modules/dock/dock-item-config.js.map +1 -0
- package/esm2015/lib/modules/dock/dock-item-reference.js +2 -0
- package/esm2015/lib/modules/dock/dock-item-reference.js.map +1 -0
- package/esm2015/lib/modules/dock/dock-item.js +29 -0
- package/esm2015/lib/modules/dock/dock-item.js.map +1 -0
- package/esm2015/lib/modules/dock/dock-location.js +19 -0
- package/esm2015/lib/modules/dock/dock-location.js.map +1 -0
- package/esm2015/lib/modules/dock/dock-options.js +2 -0
- package/esm2015/lib/modules/dock/dock-options.js.map +1 -0
- package/esm2015/lib/modules/dock/dock.component.js +95 -0
- package/esm2015/lib/modules/dock/dock.component.js.map +1 -0
- package/esm2015/lib/modules/dock/dock.module.js +20 -0
- package/esm2015/lib/modules/dock/dock.module.js.map +1 -0
- package/esm2015/lib/modules/dock/dock.service.js +92 -0
- package/esm2015/lib/modules/dock/dock.service.js.map +1 -0
- package/esm2015/lib/modules/dock/sort-by-stack-order.js +13 -0
- package/esm2015/lib/modules/dock/sort-by-stack-order.js.map +1 -0
- package/esm2015/lib/modules/dynamic-component/dynamic-component-location.js +27 -0
- package/esm2015/lib/modules/dynamic-component/dynamic-component-location.js.map +1 -0
- package/esm2015/lib/modules/dynamic-component/dynamic-component-options.js +2 -0
- package/esm2015/lib/modules/dynamic-component/dynamic-component-options.js.map +1 -0
- package/esm2015/lib/modules/dynamic-component/dynamic-component.module.js +17 -0
- package/esm2015/lib/modules/dynamic-component/dynamic-component.module.js.map +1 -0
- package/esm2015/lib/modules/dynamic-component/dynamic-component.service.js +83 -0
- package/esm2015/lib/modules/dynamic-component/dynamic-component.service.js.map +1 -0
- package/esm2015/lib/modules/format/app-format.js +18 -0
- package/esm2015/lib/modules/format/app-format.js.map +1 -0
- package/esm2015/lib/modules/id/id.directive.js +34 -0
- package/esm2015/lib/modules/id/id.directive.js.map +1 -0
- package/esm2015/lib/modules/id/id.module.js +16 -0
- package/esm2015/lib/modules/id/id.module.js.map +1 -0
- package/esm2015/lib/modules/log/log.module.js +16 -0
- package/esm2015/lib/modules/log/log.module.js.map +1 -0
- package/esm2015/lib/modules/log/log.service.js +22 -0
- package/esm2015/lib/modules/log/log.service.js.map +1 -0
- package/esm2015/lib/modules/media-query/media-breakpoints.js +20 -0
- package/esm2015/lib/modules/media-query/media-breakpoints.js.map +1 -0
- package/esm2015/lib/modules/media-query/media-query-listener.js +2 -0
- package/esm2015/lib/modules/media-query/media-query-listener.js.map +1 -0
- package/esm2015/lib/modules/media-query/media-query.module.js +16 -0
- package/esm2015/lib/modules/media-query/media-query.module.js.map +1 -0
- package/esm2015/lib/modules/media-query/media-query.service.js +121 -0
- package/esm2015/lib/modules/media-query/media-query.service.js.map +1 -0
- package/esm2015/lib/modules/mutation/mutation-observer-service.js +16 -0
- package/esm2015/lib/modules/mutation/mutation-observer-service.js.map +1 -0
- package/esm2015/lib/modules/numeric/numeric-symbol.js +2 -0
- package/esm2015/lib/modules/numeric/numeric-symbol.js.map +1 -0
- package/esm2015/lib/modules/numeric/numeric.module.js +20 -0
- package/esm2015/lib/modules/numeric/numeric.module.js.map +1 -0
- package/esm2015/lib/modules/numeric/numeric.options.js +41 -0
- package/esm2015/lib/modules/numeric/numeric.options.js.map +1 -0
- package/esm2015/lib/modules/numeric/numeric.pipe.js +83 -0
- package/esm2015/lib/modules/numeric/numeric.pipe.js.map +1 -0
- package/esm2015/lib/modules/numeric/numeric.service.js +188 -0
- package/esm2015/lib/modules/numeric/numeric.service.js.map +1 -0
- package/esm2015/lib/modules/overlay/overlay-adapter.service.js +41 -0
- package/esm2015/lib/modules/overlay/overlay-adapter.service.js.map +1 -0
- package/esm2015/lib/modules/overlay/overlay-config.js +2 -0
- package/esm2015/lib/modules/overlay/overlay-config.js.map +1 -0
- package/esm2015/lib/modules/overlay/overlay-context.js +10 -0
- package/esm2015/lib/modules/overlay/overlay-context.js.map +1 -0
- package/esm2015/lib/modules/overlay/overlay-instance.js +55 -0
- package/esm2015/lib/modules/overlay/overlay-instance.js.map +1 -0
- package/esm2015/lib/modules/overlay/overlay.component.js +154 -0
- package/esm2015/lib/modules/overlay/overlay.component.js.map +1 -0
- package/esm2015/lib/modules/overlay/overlay.module.js +18 -0
- package/esm2015/lib/modules/overlay/overlay.module.js.map +1 -0
- package/esm2015/lib/modules/overlay/overlay.service.js +120 -0
- package/esm2015/lib/modules/overlay/overlay.service.js.map +1 -0
- package/esm2015/lib/modules/percent-pipe/percent-pipe.module.js +20 -0
- package/esm2015/lib/modules/percent-pipe/percent-pipe.module.js.map +1 -0
- package/esm2015/lib/modules/percent-pipe/percent.pipe.js +48 -0
- package/esm2015/lib/modules/percent-pipe/percent.pipe.js.map +1 -0
- package/esm2015/lib/modules/scrollable-host/scrollable-host.service.js +163 -0
- package/esm2015/lib/modules/scrollable-host/scrollable-host.service.js.map +1 -0
- package/esm2015/lib/modules/shared/number-format/number-format-utility.js +74 -0
- package/esm2015/lib/modules/shared/number-format/number-format-utility.js.map +1 -0
- package/esm2015/lib/modules/shared/sky-core-resources.module.js +50 -0
- package/esm2015/lib/modules/shared/sky-core-resources.module.js.map +1 -0
- package/esm2015/lib/modules/title/set-title-args.js +2 -0
- package/esm2015/lib/modules/title/set-title-args.js.map +1 -0
- package/esm2015/lib/modules/title/title.service.js +31 -0
- package/esm2015/lib/modules/title/title.service.js.map +1 -0
- package/esm2015/lib/modules/ui-config/ui-config.service.js +21 -0
- package/esm2015/lib/modules/ui-config/ui-config.service.js.map +1 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper-boundary-info.js +2 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper-boundary-info.js.map +1 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper-fixed-styles.js +2 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper-fixed-styles.js.map +1 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper-host-options.js +10 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper-host-options.js.map +1 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper-offset.js +2 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper-offset.js.map +1 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper-options.js +2 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper-options.js.map +1 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper.directive.js +116 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper.directive.js.map +1 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper.js +254 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper.js.map +1 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper.module.js +16 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper.module.js.map +1 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper.service.js +39 -0
- package/esm2015/lib/modules/viewkeeper/viewkeeper.service.js.map +1 -0
- package/esm2015/lib/modules/window/window-ref.js +30 -0
- package/esm2015/lib/modules/window/window-ref.js.map +1 -0
- package/esm2015/skyux-core.js +2 -2
- package/esm2015/skyux-core.js.map +1 -0
- package/esm2015/testing/mock-media-query.service.js +4 -4
- package/esm2015/testing/mock-media-query.service.js.map +1 -0
- package/esm2015/testing/mock-ui-config.service.js +4 -4
- package/esm2015/testing/mock-ui-config.service.js.map +1 -0
- package/esm2015/testing/public-api.js +1 -1
- package/esm2015/testing/public-api.js.map +1 -0
- package/esm2015/testing/skyux-core-testing.js +1 -1
- package/esm2015/testing/skyux-core-testing.js.map +1 -0
- package/fesm2015/skyux-core-testing.js +6 -6
- package/fesm2015/skyux-core-testing.js.map +1 -1
- package/fesm2015/skyux-core.js +170 -166
- package/fesm2015/skyux-core.js.map +1 -1
- package/index.d.ts +57 -0
- package/{modules → lib/modules}/adapter-service/adapter.module.d.ts +0 -0
- package/{modules → lib/modules}/adapter-service/adapter.service.d.ts +0 -0
- package/{modules → lib/modules}/adapter-service/focusable-children-options.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix-auto-fit-context.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix-config.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix-horizontal-alignment.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix-offset-change.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix-offset.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix-placement-change.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix-placement.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix-utils.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix-vertical-alignment.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix.directive.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix.module.d.ts +0 -0
- package/{modules → lib/modules}/affix/affix.service.d.ts +0 -0
- package/{modules → lib/modules}/affix/affixer.d.ts +0 -0
- package/{modules → lib/modules}/affix/dom-utils.d.ts +0 -0
- package/{modules → lib/modules}/dock/dock-dom-adapter.service.d.ts +0 -0
- package/{modules → lib/modules}/dock/dock-insert-component-config.d.ts +0 -0
- package/{modules → lib/modules}/dock/dock-item-config.d.ts +0 -0
- package/{modules → lib/modules}/dock/dock-item-reference.d.ts +0 -0
- package/{modules → lib/modules}/dock/dock-item.d.ts +0 -0
- package/{modules → lib/modules}/dock/dock-location.d.ts +0 -0
- package/{modules → lib/modules}/dock/dock-options.d.ts +0 -0
- package/{modules → lib/modules}/dock/dock.component.d.ts +0 -0
- package/{modules → lib/modules}/dock/dock.module.d.ts +0 -0
- package/{modules → lib/modules}/dock/dock.service.d.ts +0 -0
- package/{modules → lib/modules}/dock/sort-by-stack-order.d.ts +0 -0
- package/{modules → lib/modules}/dynamic-component/dynamic-component-location.d.ts +0 -0
- package/{modules → lib/modules}/dynamic-component/dynamic-component-options.d.ts +0 -0
- package/{modules → lib/modules}/dynamic-component/dynamic-component.module.d.ts +0 -0
- package/{modules → lib/modules}/dynamic-component/dynamic-component.service.d.ts +0 -0
- package/{modules → lib/modules}/format/app-format.d.ts +0 -0
- package/{modules → lib/modules}/id/id.directive.d.ts +0 -0
- package/{modules → lib/modules}/id/id.module.d.ts +0 -0
- package/{modules → lib/modules}/log/log.module.d.ts +0 -0
- package/{modules → lib/modules}/log/log.service.d.ts +0 -0
- package/{modules → lib/modules}/media-query/media-breakpoints.d.ts +0 -0
- package/{modules → lib/modules}/media-query/media-query-listener.d.ts +0 -0
- package/{modules → lib/modules}/media-query/media-query.module.d.ts +0 -0
- package/{modules → lib/modules}/media-query/media-query.service.d.ts +4 -0
- package/{modules → lib/modules}/mutation/mutation-observer-service.d.ts +0 -0
- package/{modules → lib/modules}/numeric/numeric-symbol.d.ts +0 -0
- package/{modules → lib/modules}/numeric/numeric.module.d.ts +0 -0
- package/{modules → lib/modules}/numeric/numeric.options.d.ts +2 -2
- package/{modules → lib/modules}/numeric/numeric.pipe.d.ts +2 -2
- package/{modules → lib/modules}/numeric/numeric.service.d.ts +0 -0
- package/{modules → lib/modules}/overlay/overlay-adapter.service.d.ts +0 -0
- package/{modules → lib/modules}/overlay/overlay-config.d.ts +0 -0
- package/{modules → lib/modules}/overlay/overlay-context.d.ts +0 -0
- package/{modules → lib/modules}/overlay/overlay-instance.d.ts +0 -0
- package/{modules → lib/modules}/overlay/overlay.component.d.ts +0 -0
- package/{modules → lib/modules}/overlay/overlay.module.d.ts +0 -0
- package/{modules → lib/modules}/overlay/overlay.service.d.ts +0 -0
- package/{modules → lib/modules}/percent-pipe/percent-pipe.module.d.ts +0 -0
- package/{modules → lib/modules}/percent-pipe/percent.pipe.d.ts +0 -0
- package/{modules → lib/modules}/scrollable-host/scrollable-host.service.d.ts +0 -0
- package/{modules → lib/modules}/shared/number-format/number-format-utility.d.ts +0 -0
- package/{modules → lib/modules}/shared/sky-core-resources.module.d.ts +0 -0
- package/{modules → lib/modules}/title/set-title-args.d.ts +0 -0
- package/{modules → lib/modules}/title/title.service.d.ts +0 -0
- package/{modules → lib/modules}/ui-config/ui-config.service.d.ts +0 -0
- package/{modules → lib/modules}/viewkeeper/viewkeeper-boundary-info.d.ts +0 -0
- package/{modules → lib/modules}/viewkeeper/viewkeeper-fixed-styles.d.ts +0 -0
- package/{modules → lib/modules}/viewkeeper/viewkeeper-host-options.d.ts +0 -0
- package/{modules → lib/modules}/viewkeeper/viewkeeper-offset.d.ts +0 -0
- package/{modules → lib/modules}/viewkeeper/viewkeeper-options.d.ts +0 -0
- package/{modules → lib/modules}/viewkeeper/viewkeeper.d.ts +0 -0
- package/{modules → lib/modules}/viewkeeper/viewkeeper.directive.d.ts +0 -0
- package/{modules → lib/modules}/viewkeeper/viewkeeper.module.d.ts +0 -0
- package/{modules → lib/modules}/viewkeeper/viewkeeper.service.d.ts +0 -0
- package/{modules → lib/modules}/window/window-ref.d.ts +0 -0
- package/package.json +19 -5
- package/skyux-core.d.ts +1 -1
- package/LICENSE +0 -21
- package/bundles/skyux-core-testing.umd.js.map +0 -1
- package/bundles/skyux-core.umd.js.map +0 -1
- package/esm2015/modules/adapter-service/adapter.module.js +0 -16
- package/esm2015/modules/adapter-service/adapter.service.js +0 -218
- package/esm2015/modules/adapter-service/focusable-children-options.js +0 -2
- package/esm2015/modules/affix/affix-auto-fit-context.js +0 -12
- package/esm2015/modules/affix/affix-config.js +0 -2
- package/esm2015/modules/affix/affix-horizontal-alignment.js +0 -2
- package/esm2015/modules/affix/affix-offset-change.js +0 -2
- package/esm2015/modules/affix/affix-offset.js +0 -2
- package/esm2015/modules/affix/affix-placement-change.js +0 -2
- package/esm2015/modules/affix/affix-placement.js +0 -2
- package/esm2015/modules/affix/affix-utils.js +0 -18
- package/esm2015/modules/affix/affix-vertical-alignment.js +0 -2
- package/esm2015/modules/affix/affix.directive.js +0 -98
- package/esm2015/modules/affix/affix.module.js +0 -18
- package/esm2015/modules/affix/affix.service.js +0 -24
- package/esm2015/modules/affix/affixer.js +0 -349
- package/esm2015/modules/affix/dom-utils.js +0 -77
- package/esm2015/modules/dock/dock-dom-adapter.service.js +0 -79
- package/esm2015/modules/dock/dock-insert-component-config.js +0 -2
- package/esm2015/modules/dock/dock-item-config.js +0 -2
- package/esm2015/modules/dock/dock-item-reference.js +0 -2
- package/esm2015/modules/dock/dock-item.js +0 -29
- package/esm2015/modules/dock/dock-location.js +0 -19
- package/esm2015/modules/dock/dock-options.js +0 -2
- package/esm2015/modules/dock/dock.component.js +0 -95
- package/esm2015/modules/dock/dock.module.js +0 -20
- package/esm2015/modules/dock/dock.service.js +0 -91
- package/esm2015/modules/dock/sort-by-stack-order.js +0 -13
- package/esm2015/modules/dynamic-component/dynamic-component-location.js +0 -27
- package/esm2015/modules/dynamic-component/dynamic-component-options.js +0 -2
- package/esm2015/modules/dynamic-component/dynamic-component.module.js +0 -17
- package/esm2015/modules/dynamic-component/dynamic-component.service.js +0 -82
- package/esm2015/modules/format/app-format.js +0 -18
- package/esm2015/modules/id/id.directive.js +0 -34
- package/esm2015/modules/id/id.module.js +0 -16
- package/esm2015/modules/log/log.module.js +0 -16
- package/esm2015/modules/log/log.service.js +0 -22
- package/esm2015/modules/media-query/media-breakpoints.js +0 -20
- package/esm2015/modules/media-query/media-query-listener.js +0 -2
- package/esm2015/modules/media-query/media-query.module.js +0 -16
- package/esm2015/modules/media-query/media-query.service.js +0 -117
- package/esm2015/modules/mutation/mutation-observer-service.js +0 -16
- package/esm2015/modules/numeric/numeric-symbol.js +0 -2
- package/esm2015/modules/numeric/numeric.module.js +0 -20
- package/esm2015/modules/numeric/numeric.options.js +0 -41
- package/esm2015/modules/numeric/numeric.pipe.js +0 -81
- package/esm2015/modules/numeric/numeric.service.js +0 -188
- package/esm2015/modules/overlay/overlay-adapter.service.js +0 -41
- package/esm2015/modules/overlay/overlay-config.js +0 -2
- package/esm2015/modules/overlay/overlay-context.js +0 -10
- package/esm2015/modules/overlay/overlay-instance.js +0 -55
- package/esm2015/modules/overlay/overlay.component.js +0 -152
- package/esm2015/modules/overlay/overlay.module.js +0 -18
- package/esm2015/modules/overlay/overlay.service.js +0 -119
- package/esm2015/modules/percent-pipe/percent-pipe.module.js +0 -20
- package/esm2015/modules/percent-pipe/percent.pipe.js +0 -48
- package/esm2015/modules/scrollable-host/scrollable-host.service.js +0 -161
- package/esm2015/modules/shared/number-format/number-format-utility.js +0 -74
- package/esm2015/modules/shared/sky-core-resources.module.js +0 -50
- package/esm2015/modules/title/set-title-args.js +0 -2
- package/esm2015/modules/title/title.service.js +0 -30
- package/esm2015/modules/ui-config/ui-config.service.js +0 -21
- package/esm2015/modules/viewkeeper/viewkeeper-boundary-info.js +0 -2
- package/esm2015/modules/viewkeeper/viewkeeper-fixed-styles.js +0 -2
- package/esm2015/modules/viewkeeper/viewkeeper-host-options.js +0 -10
- package/esm2015/modules/viewkeeper/viewkeeper-offset.js +0 -2
- package/esm2015/modules/viewkeeper/viewkeeper-options.js +0 -2
- package/esm2015/modules/viewkeeper/viewkeeper.directive.js +0 -113
- package/esm2015/modules/viewkeeper/viewkeeper.js +0 -254
- package/esm2015/modules/viewkeeper/viewkeeper.module.js +0 -16
- package/esm2015/modules/viewkeeper/viewkeeper.service.js +0 -38
- package/esm2015/modules/window/window-ref.js +0 -30
- package/esm2015/public-api.js +0 -60
- package/public-api.d.ts +0 -57
@@ -0,0 +1,24 @@
|
|
1
|
+
import { Injectable, RendererFactory2, } from '@angular/core';
|
2
|
+
import { SkyAffixer } from './affixer';
|
3
|
+
import * as i0 from "@angular/core";
|
4
|
+
export class SkyAffixService {
|
5
|
+
constructor(rendererFactory) {
|
6
|
+
this.renderer = rendererFactory.createRenderer(undefined, undefined);
|
7
|
+
}
|
8
|
+
/**
|
9
|
+
* Creates an instance of [[SkyAffixer]].
|
10
|
+
* @param affixed The element to be affixed.
|
11
|
+
*/
|
12
|
+
createAffixer(affixed) {
|
13
|
+
return new SkyAffixer(affixed.nativeElement, this.renderer);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
SkyAffixService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyAffixService, deps: [{ token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable });
|
17
|
+
SkyAffixService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyAffixService, providedIn: 'root' });
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyAffixService, decorators: [{
|
19
|
+
type: Injectable,
|
20
|
+
args: [{
|
21
|
+
providedIn: 'root',
|
22
|
+
}]
|
23
|
+
}], ctorParameters: function () { return [{ type: i0.RendererFactory2 }]; } });
|
24
|
+
//# sourceMappingURL=affix.service.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"affix.service.js","sourceRoot":"","sources":["../../../../../../../../libs/components/core/src/lib/modules/affix/affix.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EAEV,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;;AAKvC,MAAM,OAAO,eAAe;IAG1B,YAAY,eAAiC;QAC3C,IAAI,CAAC,QAAQ,GAAG,eAAe,CAAC,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACvE,CAAC;IAED;;;OAGG;IACI,aAAa,CAAC,OAAmB;QACtC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,CAAC;;6GAbU,eAAe;iHAAf,eAAe,cAFd,MAAM;4FAEP,eAAe;kBAH3B,UAAU;mBAAC;oBACV,UAAU,EAAE,MAAM;iBACnB","sourcesContent":["import {\n ElementRef,\n Injectable,\n Renderer2,\n RendererFactory2,\n} from '@angular/core';\n\nimport { SkyAffixer } from './affixer';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class SkyAffixService {\n private renderer: Renderer2;\n\n constructor(rendererFactory: RendererFactory2) {\n this.renderer = rendererFactory.createRenderer(undefined, undefined);\n }\n\n /**\n * Creates an instance of [[SkyAffixer]].\n * @param affixed The element to be affixed.\n */\n public createAffixer(affixed: ElementRef): SkyAffixer {\n return new SkyAffixer(affixed.nativeElement, this.renderer);\n }\n}\n"]}
|
@@ -0,0 +1,349 @@
|
|
1
|
+
import { fromEvent, Subject } from 'rxjs';
|
2
|
+
import { SkyAffixAutoFitContext } from './affix-auto-fit-context';
|
3
|
+
import { getInversePlacement, getNextPlacement } from './affix-utils';
|
4
|
+
import { getElementOffset, getOverflowParents, isOffsetFullyVisibleWithinParent, isOffsetPartiallyVisibleWithinParent, } from './dom-utils';
|
5
|
+
const DEFAULT_AFFIX_CONFIG = {
|
6
|
+
autoFitContext: SkyAffixAutoFitContext.OverflowParent,
|
7
|
+
enableAutoFit: false,
|
8
|
+
horizontalAlignment: 'center',
|
9
|
+
isSticky: false,
|
10
|
+
placement: 'above',
|
11
|
+
};
|
12
|
+
export class SkyAffixer {
|
13
|
+
constructor(affixedElement, renderer) {
|
14
|
+
this.affixedElement = affixedElement;
|
15
|
+
this.renderer = renderer;
|
16
|
+
this._offsetChange = new Subject();
|
17
|
+
this._overflowScroll = new Subject();
|
18
|
+
this._placementChange = new Subject();
|
19
|
+
}
|
20
|
+
/**
|
21
|
+
* Fires when the affixed element's offset changes.
|
22
|
+
*/
|
23
|
+
get offsetChange() {
|
24
|
+
return this._offsetChange.asObservable();
|
25
|
+
}
|
26
|
+
/**
|
27
|
+
* Fires when the base element's nearest overflow parent is scrolling. This is useful if you need
|
28
|
+
* to perform an additional action during the scroll event but don't want to generate another
|
29
|
+
* event listener.
|
30
|
+
*/
|
31
|
+
get overflowScroll() {
|
32
|
+
return this._overflowScroll.asObservable();
|
33
|
+
}
|
34
|
+
/**
|
35
|
+
* Fires when the placement value changes. A `null` value indicates that a suitable
|
36
|
+
* placement could not be found.
|
37
|
+
*/
|
38
|
+
get placementChange() {
|
39
|
+
return this._placementChange.asObservable();
|
40
|
+
}
|
41
|
+
get config() {
|
42
|
+
return this._config;
|
43
|
+
}
|
44
|
+
set config(value) {
|
45
|
+
const merged = Object.assign(Object.assign({}, DEFAULT_AFFIX_CONFIG), value);
|
46
|
+
// Make sure none of the values are undefined.
|
47
|
+
Object.keys(merged).forEach((k) => {
|
48
|
+
if (merged[k] === undefined) {
|
49
|
+
merged[k] = DEFAULT_AFFIX_CONFIG[k];
|
50
|
+
}
|
51
|
+
});
|
52
|
+
this._config = merged;
|
53
|
+
}
|
54
|
+
/**
|
55
|
+
* Affixes an element to a base element.
|
56
|
+
* @param baseElement The base element.
|
57
|
+
* @param config Configuration for the affix action.
|
58
|
+
*/
|
59
|
+
affixTo(baseElement, config) {
|
60
|
+
this.reset();
|
61
|
+
this.config = config;
|
62
|
+
this.baseElement = baseElement;
|
63
|
+
this.overflowParents = getOverflowParents(baseElement);
|
64
|
+
this.affix();
|
65
|
+
if (this.config.isSticky) {
|
66
|
+
this.addScrollListeners();
|
67
|
+
this.addResizeListener();
|
68
|
+
}
|
69
|
+
}
|
70
|
+
/**
|
71
|
+
* Re-runs the affix calculation.
|
72
|
+
*/
|
73
|
+
reaffix() {
|
74
|
+
// Reset current placement to preferred placement.
|
75
|
+
this.currentPlacement = this.config.placement;
|
76
|
+
this.affix();
|
77
|
+
}
|
78
|
+
/**
|
79
|
+
* Destroys the affixer.
|
80
|
+
*/
|
81
|
+
destroy() {
|
82
|
+
this.reset();
|
83
|
+
this._placementChange.complete();
|
84
|
+
this._offsetChange.complete();
|
85
|
+
this._overflowScroll.complete();
|
86
|
+
this._offsetChange =
|
87
|
+
this._placementChange =
|
88
|
+
this._overflowScroll =
|
89
|
+
undefined;
|
90
|
+
}
|
91
|
+
affix() {
|
92
|
+
this.baseRect = this.baseElement.getBoundingClientRect();
|
93
|
+
this.affixedRect = this.affixedElement.getBoundingClientRect();
|
94
|
+
const offset = this.getOffset();
|
95
|
+
if (this.isNewOffset(offset)) {
|
96
|
+
this.renderer.setStyle(this.affixedElement, 'top', `${offset.top}px`);
|
97
|
+
this.renderer.setStyle(this.affixedElement, 'left', `${offset.left}px`);
|
98
|
+
this._offsetChange.next({ offset });
|
99
|
+
}
|
100
|
+
}
|
101
|
+
getOffset() {
|
102
|
+
const parent = this.getAutoFitContextParent();
|
103
|
+
const maxAttempts = 4;
|
104
|
+
let attempts = 0;
|
105
|
+
let isAffixedElementFullyVisible = false;
|
106
|
+
let offset;
|
107
|
+
let placement = this.config.placement;
|
108
|
+
do {
|
109
|
+
offset = this.getPreferredOffset(placement);
|
110
|
+
isAffixedElementFullyVisible = isOffsetFullyVisibleWithinParent(parent, offset, this.config.autoFitOverflowOffset);
|
111
|
+
if (!this.config.enableAutoFit) {
|
112
|
+
break;
|
113
|
+
}
|
114
|
+
if (!isAffixedElementFullyVisible) {
|
115
|
+
placement =
|
116
|
+
attempts % 2 === 0
|
117
|
+
? getInversePlacement(placement)
|
118
|
+
: getNextPlacement(placement);
|
119
|
+
}
|
120
|
+
attempts++;
|
121
|
+
} while (!isAffixedElementFullyVisible && attempts < maxAttempts);
|
122
|
+
if (isAffixedElementFullyVisible) {
|
123
|
+
if (this.isBaseElementVisible()) {
|
124
|
+
this.notifyPlacementChange(placement);
|
125
|
+
}
|
126
|
+
else {
|
127
|
+
/* tslint:disable-next-line:no-null-keyword */
|
128
|
+
this.notifyPlacementChange(null);
|
129
|
+
}
|
130
|
+
return offset;
|
131
|
+
}
|
132
|
+
if (this.config.enableAutoFit) {
|
133
|
+
/* tslint:disable-next-line:no-null-keyword */
|
134
|
+
this.notifyPlacementChange(null);
|
135
|
+
}
|
136
|
+
// No suitable placement was found, so revert to preferred placement.
|
137
|
+
return this.getPreferredOffset(this.config.placement);
|
138
|
+
}
|
139
|
+
getPreferredOffset(placement) {
|
140
|
+
const affixedRect = this.affixedRect;
|
141
|
+
const baseRect = this.baseRect;
|
142
|
+
const horizontalAlignment = this.config.horizontalAlignment;
|
143
|
+
const verticalAlignment = this.config.verticalAlignment;
|
144
|
+
const enableAutoFit = this.config.enableAutoFit;
|
145
|
+
let top;
|
146
|
+
let left;
|
147
|
+
if (placement === 'above' || placement === 'below') {
|
148
|
+
if (placement === 'above') {
|
149
|
+
top = baseRect.top - affixedRect.height;
|
150
|
+
switch (verticalAlignment) {
|
151
|
+
case 'top':
|
152
|
+
top = top + affixedRect.height;
|
153
|
+
break;
|
154
|
+
case 'middle':
|
155
|
+
top = top + affixedRect.height / 2;
|
156
|
+
break;
|
157
|
+
case 'bottom':
|
158
|
+
default:
|
159
|
+
break;
|
160
|
+
}
|
161
|
+
}
|
162
|
+
else {
|
163
|
+
top = baseRect.bottom;
|
164
|
+
switch (verticalAlignment) {
|
165
|
+
case 'top':
|
166
|
+
default:
|
167
|
+
break;
|
168
|
+
case 'middle':
|
169
|
+
top = top - affixedRect.height / 2;
|
170
|
+
break;
|
171
|
+
case 'bottom':
|
172
|
+
top = top - affixedRect.height;
|
173
|
+
break;
|
174
|
+
}
|
175
|
+
}
|
176
|
+
switch (horizontalAlignment) {
|
177
|
+
case 'left':
|
178
|
+
left = baseRect.left;
|
179
|
+
break;
|
180
|
+
case 'center':
|
181
|
+
default:
|
182
|
+
left = baseRect.left + baseRect.width / 2 - affixedRect.width / 2;
|
183
|
+
break;
|
184
|
+
case 'right':
|
185
|
+
left = baseRect.right - affixedRect.width;
|
186
|
+
break;
|
187
|
+
}
|
188
|
+
}
|
189
|
+
else {
|
190
|
+
if (placement === 'left') {
|
191
|
+
left = baseRect.left - affixedRect.width;
|
192
|
+
}
|
193
|
+
else {
|
194
|
+
left = baseRect.right;
|
195
|
+
}
|
196
|
+
switch (verticalAlignment) {
|
197
|
+
case 'top':
|
198
|
+
top = baseRect.top;
|
199
|
+
break;
|
200
|
+
case 'middle':
|
201
|
+
default:
|
202
|
+
top = baseRect.top + baseRect.height / 2 - affixedRect.height / 2;
|
203
|
+
break;
|
204
|
+
case 'bottom':
|
205
|
+
top = baseRect.bottom - affixedRect.height;
|
206
|
+
break;
|
207
|
+
}
|
208
|
+
}
|
209
|
+
let offset = { left, top };
|
210
|
+
if (enableAutoFit) {
|
211
|
+
offset = this.adjustOffsetToOverflowParent(Object.assign({}, offset), placement);
|
212
|
+
}
|
213
|
+
offset.bottom = offset.top + affixedRect.height;
|
214
|
+
offset.right = offset.left + affixedRect.width;
|
215
|
+
return offset;
|
216
|
+
}
|
217
|
+
/**
|
218
|
+
* Slightly adjust the offset to fit within the scroll parent's boundaries if
|
219
|
+
* the affixed element would otherwise be clipped.
|
220
|
+
*/
|
221
|
+
adjustOffsetToOverflowParent(offset, placement) {
|
222
|
+
const parent = this.getAutoFitContextParent();
|
223
|
+
const parentOffset = getElementOffset(parent, this.config.autoFitOverflowOffset);
|
224
|
+
const affixedRect = this.affixedRect;
|
225
|
+
const baseRect = this.baseRect;
|
226
|
+
// A pixel value representing the leeway between the edge of the overflow parent and the edge
|
227
|
+
// of the base element before it dissapears from view.
|
228
|
+
// If the visible portion of the base element is less than this pixel value, the auto-fit
|
229
|
+
// functionality attempts to find another placement.
|
230
|
+
const defaultPixelTolerance = 40;
|
231
|
+
let pixelTolerance;
|
232
|
+
const originalOffsetTop = offset.top;
|
233
|
+
const originalOffsetLeft = offset.left;
|
234
|
+
/* tslint:disable-next-line:switch-default */
|
235
|
+
switch (placement) {
|
236
|
+
case 'above':
|
237
|
+
case 'below':
|
238
|
+
// Keep the affixed element within the overflow parent.
|
239
|
+
if (offset.left < parentOffset.left) {
|
240
|
+
offset.left = parentOffset.left;
|
241
|
+
}
|
242
|
+
else if (offset.left + affixedRect.width > parentOffset.right) {
|
243
|
+
offset.left = parentOffset.right - affixedRect.width;
|
244
|
+
}
|
245
|
+
// Use a smaller pixel tolerance if the base element width is less than the default.
|
246
|
+
pixelTolerance = Math.min(defaultPixelTolerance, baseRect.width);
|
247
|
+
// Make sure the affixed element never detaches from the base element.
|
248
|
+
if (offset.left + pixelTolerance > baseRect.right ||
|
249
|
+
offset.left + affixedRect.width - pixelTolerance < baseRect.left) {
|
250
|
+
offset.left = originalOffsetLeft;
|
251
|
+
}
|
252
|
+
break;
|
253
|
+
case 'left':
|
254
|
+
case 'right':
|
255
|
+
// Keep the affixed element within the overflow parent.
|
256
|
+
if (offset.top < parentOffset.top) {
|
257
|
+
offset.top = parentOffset.top;
|
258
|
+
}
|
259
|
+
else if (offset.top + affixedRect.height > parentOffset.bottom) {
|
260
|
+
offset.top = parentOffset.bottom - affixedRect.height;
|
261
|
+
}
|
262
|
+
// Use a smaller pixel tolerance if the base element height is less than the default.
|
263
|
+
pixelTolerance = Math.min(defaultPixelTolerance, baseRect.height);
|
264
|
+
// Make sure the affixed element never detaches from the base element.
|
265
|
+
if (offset.top + pixelTolerance > baseRect.bottom ||
|
266
|
+
offset.top + affixedRect.height - pixelTolerance < baseRect.top) {
|
267
|
+
offset.top = originalOffsetTop;
|
268
|
+
}
|
269
|
+
break;
|
270
|
+
}
|
271
|
+
return offset;
|
272
|
+
}
|
273
|
+
getImmediateOverflowParent() {
|
274
|
+
return this.overflowParents[this.overflowParents.length - 1];
|
275
|
+
}
|
276
|
+
getAutoFitContextParent() {
|
277
|
+
const bodyElement = this.overflowParents[0];
|
278
|
+
return this.config.autoFitContext === SkyAffixAutoFitContext.OverflowParent
|
279
|
+
? this.getImmediateOverflowParent()
|
280
|
+
: bodyElement;
|
281
|
+
}
|
282
|
+
notifyPlacementChange(placement) {
|
283
|
+
if (this.currentPlacement !== placement) {
|
284
|
+
this.currentPlacement = placement;
|
285
|
+
this._placementChange.next({
|
286
|
+
placement,
|
287
|
+
});
|
288
|
+
}
|
289
|
+
}
|
290
|
+
reset() {
|
291
|
+
this.removeScrollListeners();
|
292
|
+
this.removeResizeListener();
|
293
|
+
this._config =
|
294
|
+
this.affixedRect =
|
295
|
+
this.baseElement =
|
296
|
+
this.baseRect =
|
297
|
+
this.currentPlacement =
|
298
|
+
this.currentOffset =
|
299
|
+
this.overflowParents =
|
300
|
+
undefined;
|
301
|
+
}
|
302
|
+
isNewOffset(offset) {
|
303
|
+
if (this.currentOffset === undefined) {
|
304
|
+
this.currentOffset = offset;
|
305
|
+
return true;
|
306
|
+
}
|
307
|
+
if (this.currentOffset.top === offset.top &&
|
308
|
+
this.currentOffset.left === offset.left) {
|
309
|
+
return false;
|
310
|
+
}
|
311
|
+
this.currentOffset = offset;
|
312
|
+
return true;
|
313
|
+
}
|
314
|
+
isBaseElementVisible() {
|
315
|
+
return isOffsetPartiallyVisibleWithinParent(this.getImmediateOverflowParent(), {
|
316
|
+
top: this.baseRect.top,
|
317
|
+
left: this.baseRect.left,
|
318
|
+
right: this.baseRect.right,
|
319
|
+
bottom: this.baseRect.bottom,
|
320
|
+
}, this.config.autoFitOverflowOffset);
|
321
|
+
}
|
322
|
+
addScrollListeners() {
|
323
|
+
this.scrollListeners = this.overflowParents.map((parentElement) => {
|
324
|
+
const overflow = parentElement === document.body ? 'window' : parentElement;
|
325
|
+
return this.renderer.listen(overflow, 'scroll', () => {
|
326
|
+
this.affix();
|
327
|
+
this._overflowScroll.next();
|
328
|
+
});
|
329
|
+
});
|
330
|
+
}
|
331
|
+
addResizeListener() {
|
332
|
+
this.resizeListener = fromEvent(window, 'resize').subscribe(() => this.affix());
|
333
|
+
}
|
334
|
+
removeResizeListener() {
|
335
|
+
if (this.resizeListener) {
|
336
|
+
this.resizeListener.unsubscribe();
|
337
|
+
this.resizeListener = undefined;
|
338
|
+
}
|
339
|
+
}
|
340
|
+
removeScrollListeners() {
|
341
|
+
if (this.scrollListeners) {
|
342
|
+
// Remove renderer-generated listeners by calling the listener itself.
|
343
|
+
// https://github.com/angular/angular/issues/9368#issuecomment-227199778
|
344
|
+
this.scrollListeners.forEach((listener) => listener());
|
345
|
+
this.scrollListeners = undefined;
|
346
|
+
}
|
347
|
+
}
|
348
|
+
}
|
349
|
+
//# sourceMappingURL=affixer.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"affixer.js","sourceRoot":"","sources":["../../../../../../../../libs/components/core/src/lib/modules/affix/affixer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAc,OAAO,EAAgB,MAAM,MAAM,CAAC;AAEpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAYlE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,gCAAgC,EAChC,oCAAoC,GACrC,MAAM,aAAa,CAAC;AAErB,MAAM,oBAAoB,GAAmB;IAC3C,cAAc,EAAE,sBAAsB,CAAC,cAAc;IACrD,aAAa,EAAE,KAAK;IACpB,mBAAmB,EAAE,QAAQ;IAC7B,QAAQ,EAAE,KAAK;IACf,SAAS,EAAE,OAAO;CACnB,CAAC;AAEF,MAAM,OAAO,UAAU;IAkErB,YACU,cAA2B,EAC3B,QAAmB;QADnB,mBAAc,GAAd,cAAc,CAAa;QAC3B,aAAQ,GAAR,QAAQ,CAAW;QARrB,kBAAa,GAAG,IAAI,OAAO,EAAwB,CAAC;QAEpD,oBAAe,GAAG,IAAI,OAAO,EAAQ,CAAC;QAEtC,qBAAgB,GAAG,IAAI,OAAO,EAA2B,CAAC;IAK/D,CAAC;IApEJ;;OAEG;IACH,IAAW,YAAY;QACrB,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACH,IAAW,eAAe;QACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;IAC9C,CAAC;IAED,IAAY,MAAM;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAY,MAAM,CAAC,KAAqB;QACtC,MAAM,MAAM,mCAAQ,oBAAoB,GAAK,KAAK,CAAE,CAAC;QAErD,8CAA8C;QAC9C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAuB,EAAE,EAAE;YACtD,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE;gBAC1B,MAAc,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;aAC9C;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IA+BD;;;;OAIG;IACI,OAAO,CAAC,WAAwB,EAAE,MAAuB;QAC9D,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,eAAe,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAEvD,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YACxB,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC1B;IACH,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,kDAAkD;QAClD,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,CAAC;QAEhC,IAAI,CAAC,aAAa;YAChB,IAAI,CAAC,gBAAgB;gBACrB,IAAI,CAAC,eAAe;oBAClB,SAAS,CAAC;IAChB,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,qBAAqB,EAAE,CAAC;QACzD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,qBAAqB,EAAE,CAAC;QAE/D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAEhC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE;YAC5B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;YACtE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;YACxE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;SACrC;IACH,CAAC;IAEO,SAAS;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE9C,MAAM,WAAW,GAAG,CAAC,CAAC;QACtB,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,IAAI,4BAA4B,GAAG,KAAK,CAAC;QACzC,IAAI,MAAsB,CAAC;QAC3B,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAEtC,GAAG;YACD,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YAC5C,4BAA4B,GAAG,gCAAgC,CAC7D,MAAM,EACN,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAClC,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;gBAC9B,MAAM;aACP;YAED,IAAI,CAAC,4BAA4B,EAAE;gBACjC,SAAS;oBACP,QAAQ,GAAG,CAAC,KAAK,CAAC;wBAChB,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC;wBAChC,CAAC,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;aACnC;YAED,QAAQ,EAAE,CAAC;SACZ,QAAQ,CAAC,4BAA4B,IAAI,QAAQ,GAAG,WAAW,EAAE;QAElE,IAAI,4BAA4B,EAAE;YAChC,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;gBAC/B,IAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;aACvC;iBAAM;gBACL,8CAA8C;gBAC9C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;aAClC;YAED,OAAO,MAAM,CAAC;SACf;QAED,IAAI,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;YAC7B,8CAA8C;YAC9C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;SAClC;QAED,qEAAqE;QACrE,OAAO,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;IAEO,kBAAkB,CAAC,SAA4B;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC;QAC5D,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;QACxD,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;QAEhD,IAAI,GAAW,CAAC;QAChB,IAAI,IAAY,CAAC;QAEjB,IAAI,SAAS,KAAK,OAAO,IAAI,SAAS,KAAK,OAAO,EAAE;YAClD,IAAI,SAAS,KAAK,OAAO,EAAE;gBACzB,GAAG,GAAG,QAAQ,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC;gBAExC,QAAQ,iBAAiB,EAAE;oBACzB,KAAK,KAAK;wBACR,GAAG,GAAG,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC;wBAC/B,MAAM;oBACR,KAAK,QAAQ;wBACX,GAAG,GAAG,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;wBACnC,MAAM;oBACR,KAAK,QAAQ,CAAC;oBACd;wBACE,MAAM;iBACT;aACF;iBAAM;gBACL,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAEtB,QAAQ,iBAAiB,EAAE;oBACzB,KAAK,KAAK,CAAC;oBACX;wBACE,MAAM;oBACR,KAAK,QAAQ;wBACX,GAAG,GAAG,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;wBACnC,MAAM;oBACR,KAAK,QAAQ;wBACX,GAAG,GAAG,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC;wBAC/B,MAAM;iBACT;aACF;YAED,QAAQ,mBAAmB,EAAE;gBAC3B,KAAK,MAAM;oBACT,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;oBACrB,MAAM;gBAER,KAAK,QAAQ,CAAC;gBACd;oBACE,IAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;oBAClE,MAAM;gBAER,KAAK,OAAO;oBACV,IAAI,GAAG,QAAQ,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;oBAC1C,MAAM;aACT;SACF;aAAM;YACL,IAAI,SAAS,KAAK,MAAM,EAAE;gBACxB,IAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;aAC1C;iBAAM;gBACL,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;aACvB;YAED,QAAQ,iBAAiB,EAAE;gBACzB,KAAK,KAAK;oBACR,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;oBACnB,MAAM;gBAER,KAAK,QAAQ,CAAC;gBACd;oBACE,GAAG,GAAG,QAAQ,CAAC,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;oBAClE,MAAM;gBAER,KAAK,QAAQ;oBACX,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;oBAC3C,MAAM;aACT;SACF;QAED,IAAI,MAAM,GAAmB,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAC3C,IAAI,aAAa,EAAE;YACjB,MAAM,GAAG,IAAI,CAAC,4BAA4B,mBAAM,MAAM,GAAI,SAAS,CAAC,CAAC;SACtE;QAED,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC;QAChD,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC;QAE/C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACK,4BAA4B,CAClC,MAAsB,EACtB,SAA4B;QAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC9C,MAAM,YAAY,GAAG,gBAAgB,CACnC,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAClC,CAAC;QAEF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE/B,6FAA6F;QAC7F,sDAAsD;QACtD,yFAAyF;QACzF,oDAAoD;QACpD,MAAM,qBAAqB,GAAG,EAAE,CAAC;QACjC,IAAI,cAAsB,CAAC;QAE3B,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC;QACrC,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC;QAEvC,6CAA6C;QAC7C,QAAQ,SAAS,EAAE;YACjB,KAAK,OAAO,CAAC;YACb,KAAK,OAAO;gBACV,uDAAuD;gBACvD,IAAI,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE;oBACnC,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;iBACjC;qBAAM,IAAI,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE;oBAC/D,MAAM,CAAC,IAAI,GAAG,YAAY,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;iBACtD;gBAED,oFAAoF;gBACpF,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAEjE,sEAAsE;gBACtE,IACE,MAAM,CAAC,IAAI,GAAG,cAAc,GAAG,QAAQ,CAAC,KAAK;oBAC7C,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,cAAc,GAAG,QAAQ,CAAC,IAAI,EAChE;oBACA,MAAM,CAAC,IAAI,GAAG,kBAAkB,CAAC;iBAClC;gBAED,MAAM;YAER,KAAK,MAAM,CAAC;YACZ,KAAK,OAAO;gBACV,uDAAuD;gBACvD,IAAI,MAAM,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,EAAE;oBACjC,MAAM,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC;iBAC/B;qBAAM,IAAI,MAAM,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE;oBAChE,MAAM,CAAC,GAAG,GAAG,YAAY,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;iBACvD;gBAED,qFAAqF;gBACrF,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAElE,sEAAsE;gBACtE,IACE,MAAM,CAAC,GAAG,GAAG,cAAc,GAAG,QAAQ,CAAC,MAAM;oBAC7C,MAAM,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,cAAc,GAAG,QAAQ,CAAC,GAAG,EAC/D;oBACA,MAAM,CAAC,GAAG,GAAG,iBAAiB,CAAC;iBAChC;gBAED,MAAM;SACT;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,0BAA0B;QAChC,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,uBAAuB;QAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAE5C,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,KAAK,sBAAsB,CAAC,cAAc;YACzE,CAAC,CAAC,IAAI,CAAC,0BAA0B,EAAE;YACnC,CAAC,CAAC,WAAW,CAAC;IAClB,CAAC;IAEO,qBAAqB,CAAC,SAAmC;QAC/D,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE;YACvC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAClC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACzB,SAAS;aACV,CAAC,CAAC;SACJ;IACH,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC7B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAE5B,IAAI,CAAC,OAAO;YACV,IAAI,CAAC,WAAW;gBAChB,IAAI,CAAC,WAAW;oBAChB,IAAI,CAAC,QAAQ;wBACb,IAAI,CAAC,gBAAgB;4BACrB,IAAI,CAAC,aAAa;gCAClB,IAAI,CAAC,eAAe;oCAClB,SAAS,CAAC;IAChB,CAAC;IAEO,WAAW,CAAC,MAAsB;QACxC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE;YACpC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;YAC5B,OAAO,IAAI,CAAC;SACb;QAED,IACE,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;YACrC,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EACvC;YACA,OAAO,KAAK,CAAC;SACd;QAED,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAE5B,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,oBAAoB;QAC1B,OAAO,oCAAoC,CACzC,IAAI,CAAC,0BAA0B,EAAE,EACjC;YACE,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,GAAG;YACtB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;YACxB,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK;YAC1B,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;SAC7B,EACD,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAClC,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE;YAChE,MAAM,QAAQ,GACZ,aAAa,KAAK,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC;YAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE;gBACnD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB;QACvB,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAC/D,IAAI,CAAC,KAAK,EAAE,CACb,CAAC;IACJ,CAAC;IAEO,oBAAoB;QAC1B,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;SACjC;IACH,CAAC;IAEO,qBAAqB;QAC3B,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,sEAAsE;YACtE,wEAAwE;YACxE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YACvD,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;SAClC;IACH,CAAC;CACF","sourcesContent":["import { Renderer2 } from '@angular/core';\n\nimport { fromEvent, Observable, Subject, Subscription } from 'rxjs';\n\nimport { SkyAffixAutoFitContext } from './affix-auto-fit-context';\n\nimport { SkyAffixOffsetChange } from './affix-offset-change';\n\nimport { SkyAffixOffset } from './affix-offset';\n\nimport { SkyAffixConfig } from './affix-config';\n\nimport { SkyAffixPlacement } from './affix-placement';\n\nimport { SkyAffixPlacementChange } from './affix-placement-change';\n\nimport { getInversePlacement, getNextPlacement } from './affix-utils';\n\nimport {\n getElementOffset,\n getOverflowParents,\n isOffsetFullyVisibleWithinParent,\n isOffsetPartiallyVisibleWithinParent,\n} from './dom-utils';\n\nconst DEFAULT_AFFIX_CONFIG: SkyAffixConfig = {\n autoFitContext: SkyAffixAutoFitContext.OverflowParent,\n enableAutoFit: false,\n horizontalAlignment: 'center',\n isSticky: false,\n placement: 'above',\n};\n\nexport class SkyAffixer {\n /**\n * Fires when the affixed element's offset changes.\n */\n public get offsetChange(): Observable<SkyAffixOffsetChange> {\n return this._offsetChange.asObservable();\n }\n\n /**\n * Fires when the base element's nearest overflow parent is scrolling. This is useful if you need\n * to perform an additional action during the scroll event but don't want to generate another\n * event listener.\n */\n public get overflowScroll(): Observable<void> {\n return this._overflowScroll.asObservable();\n }\n\n /**\n * Fires when the placement value changes. A `null` value indicates that a suitable\n * placement could not be found.\n */\n public get placementChange(): Observable<SkyAffixPlacementChange> {\n return this._placementChange.asObservable();\n }\n\n private get config(): SkyAffixConfig {\n return this._config;\n }\n\n private set config(value: SkyAffixConfig) {\n const merged = { ...DEFAULT_AFFIX_CONFIG, ...value };\n\n // Make sure none of the values are undefined.\n Object.keys(merged).forEach((k: keyof SkyAffixConfig) => {\n if (merged[k] === undefined) {\n (merged as any)[k] = DEFAULT_AFFIX_CONFIG[k];\n }\n });\n\n this._config = merged;\n }\n\n private affixedRect: ClientRect;\n\n private baseElement: HTMLElement;\n\n private baseRect: ClientRect;\n\n private currentOffset: SkyAffixOffset;\n\n private currentPlacement: SkyAffixPlacement;\n\n private overflowParents: HTMLElement[];\n\n private resizeListener: Subscription;\n\n private scrollListeners: Function[];\n\n private _config: SkyAffixConfig;\n\n private _offsetChange = new Subject<SkyAffixOffsetChange>();\n\n private _overflowScroll = new Subject<void>();\n\n private _placementChange = new Subject<SkyAffixPlacementChange>();\n\n constructor(\n private affixedElement: HTMLElement,\n private renderer: Renderer2\n ) {}\n\n /**\n * Affixes an element to a base element.\n * @param baseElement The base element.\n * @param config Configuration for the affix action.\n */\n public affixTo(baseElement: HTMLElement, config?: SkyAffixConfig): void {\n this.reset();\n\n this.config = config;\n this.baseElement = baseElement;\n this.overflowParents = getOverflowParents(baseElement);\n\n this.affix();\n\n if (this.config.isSticky) {\n this.addScrollListeners();\n this.addResizeListener();\n }\n }\n\n /**\n * Re-runs the affix calculation.\n */\n public reaffix(): void {\n // Reset current placement to preferred placement.\n this.currentPlacement = this.config.placement;\n this.affix();\n }\n\n /**\n * Destroys the affixer.\n */\n public destroy(): void {\n this.reset();\n this._placementChange.complete();\n this._offsetChange.complete();\n this._overflowScroll.complete();\n\n this._offsetChange =\n this._placementChange =\n this._overflowScroll =\n undefined;\n }\n\n private affix(): void {\n this.baseRect = this.baseElement.getBoundingClientRect();\n this.affixedRect = this.affixedElement.getBoundingClientRect();\n\n const offset = this.getOffset();\n\n if (this.isNewOffset(offset)) {\n this.renderer.setStyle(this.affixedElement, 'top', `${offset.top}px`);\n this.renderer.setStyle(this.affixedElement, 'left', `${offset.left}px`);\n this._offsetChange.next({ offset });\n }\n }\n\n private getOffset(): SkyAffixOffset {\n const parent = this.getAutoFitContextParent();\n\n const maxAttempts = 4;\n let attempts = 0;\n\n let isAffixedElementFullyVisible = false;\n let offset: SkyAffixOffset;\n let placement = this.config.placement;\n\n do {\n offset = this.getPreferredOffset(placement);\n isAffixedElementFullyVisible = isOffsetFullyVisibleWithinParent(\n parent,\n offset,\n this.config.autoFitOverflowOffset\n );\n\n if (!this.config.enableAutoFit) {\n break;\n }\n\n if (!isAffixedElementFullyVisible) {\n placement =\n attempts % 2 === 0\n ? getInversePlacement(placement)\n : getNextPlacement(placement);\n }\n\n attempts++;\n } while (!isAffixedElementFullyVisible && attempts < maxAttempts);\n\n if (isAffixedElementFullyVisible) {\n if (this.isBaseElementVisible()) {\n this.notifyPlacementChange(placement);\n } else {\n /* tslint:disable-next-line:no-null-keyword */\n this.notifyPlacementChange(null);\n }\n\n return offset;\n }\n\n if (this.config.enableAutoFit) {\n /* tslint:disable-next-line:no-null-keyword */\n this.notifyPlacementChange(null);\n }\n\n // No suitable placement was found, so revert to preferred placement.\n return this.getPreferredOffset(this.config.placement);\n }\n\n private getPreferredOffset(placement: SkyAffixPlacement): SkyAffixOffset {\n const affixedRect = this.affixedRect;\n const baseRect = this.baseRect;\n\n const horizontalAlignment = this.config.horizontalAlignment;\n const verticalAlignment = this.config.verticalAlignment;\n const enableAutoFit = this.config.enableAutoFit;\n\n let top: number;\n let left: number;\n\n if (placement === 'above' || placement === 'below') {\n if (placement === 'above') {\n top = baseRect.top - affixedRect.height;\n\n switch (verticalAlignment) {\n case 'top':\n top = top + affixedRect.height;\n break;\n case 'middle':\n top = top + affixedRect.height / 2;\n break;\n case 'bottom':\n default:\n break;\n }\n } else {\n top = baseRect.bottom;\n\n switch (verticalAlignment) {\n case 'top':\n default:\n break;\n case 'middle':\n top = top - affixedRect.height / 2;\n break;\n case 'bottom':\n top = top - affixedRect.height;\n break;\n }\n }\n\n switch (horizontalAlignment) {\n case 'left':\n left = baseRect.left;\n break;\n\n case 'center':\n default:\n left = baseRect.left + baseRect.width / 2 - affixedRect.width / 2;\n break;\n\n case 'right':\n left = baseRect.right - affixedRect.width;\n break;\n }\n } else {\n if (placement === 'left') {\n left = baseRect.left - affixedRect.width;\n } else {\n left = baseRect.right;\n }\n\n switch (verticalAlignment) {\n case 'top':\n top = baseRect.top;\n break;\n\n case 'middle':\n default:\n top = baseRect.top + baseRect.height / 2 - affixedRect.height / 2;\n break;\n\n case 'bottom':\n top = baseRect.bottom - affixedRect.height;\n break;\n }\n }\n\n let offset: SkyAffixOffset = { left, top };\n if (enableAutoFit) {\n offset = this.adjustOffsetToOverflowParent({ ...offset }, placement);\n }\n\n offset.bottom = offset.top + affixedRect.height;\n offset.right = offset.left + affixedRect.width;\n\n return offset;\n }\n\n /**\n * Slightly adjust the offset to fit within the scroll parent's boundaries if\n * the affixed element would otherwise be clipped.\n */\n private adjustOffsetToOverflowParent(\n offset: SkyAffixOffset,\n placement: SkyAffixPlacement\n ): SkyAffixOffset {\n const parent = this.getAutoFitContextParent();\n const parentOffset = getElementOffset(\n parent,\n this.config.autoFitOverflowOffset\n );\n\n const affixedRect = this.affixedRect;\n const baseRect = this.baseRect;\n\n // A pixel value representing the leeway between the edge of the overflow parent and the edge\n // of the base element before it dissapears from view.\n // If the visible portion of the base element is less than this pixel value, the auto-fit\n // functionality attempts to find another placement.\n const defaultPixelTolerance = 40;\n let pixelTolerance: number;\n\n const originalOffsetTop = offset.top;\n const originalOffsetLeft = offset.left;\n\n /* tslint:disable-next-line:switch-default */\n switch (placement) {\n case 'above':\n case 'below':\n // Keep the affixed element within the overflow parent.\n if (offset.left < parentOffset.left) {\n offset.left = parentOffset.left;\n } else if (offset.left + affixedRect.width > parentOffset.right) {\n offset.left = parentOffset.right - affixedRect.width;\n }\n\n // Use a smaller pixel tolerance if the base element width is less than the default.\n pixelTolerance = Math.min(defaultPixelTolerance, baseRect.width);\n\n // Make sure the affixed element never detaches from the base element.\n if (\n offset.left + pixelTolerance > baseRect.right ||\n offset.left + affixedRect.width - pixelTolerance < baseRect.left\n ) {\n offset.left = originalOffsetLeft;\n }\n\n break;\n\n case 'left':\n case 'right':\n // Keep the affixed element within the overflow parent.\n if (offset.top < parentOffset.top) {\n offset.top = parentOffset.top;\n } else if (offset.top + affixedRect.height > parentOffset.bottom) {\n offset.top = parentOffset.bottom - affixedRect.height;\n }\n\n // Use a smaller pixel tolerance if the base element height is less than the default.\n pixelTolerance = Math.min(defaultPixelTolerance, baseRect.height);\n\n // Make sure the affixed element never detaches from the base element.\n if (\n offset.top + pixelTolerance > baseRect.bottom ||\n offset.top + affixedRect.height - pixelTolerance < baseRect.top\n ) {\n offset.top = originalOffsetTop;\n }\n\n break;\n }\n\n return offset;\n }\n\n private getImmediateOverflowParent(): HTMLElement {\n return this.overflowParents[this.overflowParents.length - 1];\n }\n\n private getAutoFitContextParent(): HTMLElement {\n const bodyElement = this.overflowParents[0];\n\n return this.config.autoFitContext === SkyAffixAutoFitContext.OverflowParent\n ? this.getImmediateOverflowParent()\n : bodyElement;\n }\n\n private notifyPlacementChange(placement: SkyAffixPlacement | null): void {\n if (this.currentPlacement !== placement) {\n this.currentPlacement = placement;\n this._placementChange.next({\n placement,\n });\n }\n }\n\n private reset(): void {\n this.removeScrollListeners();\n this.removeResizeListener();\n\n this._config =\n this.affixedRect =\n this.baseElement =\n this.baseRect =\n this.currentPlacement =\n this.currentOffset =\n this.overflowParents =\n undefined;\n }\n\n private isNewOffset(offset: SkyAffixOffset): boolean {\n if (this.currentOffset === undefined) {\n this.currentOffset = offset;\n return true;\n }\n\n if (\n this.currentOffset.top === offset.top &&\n this.currentOffset.left === offset.left\n ) {\n return false;\n }\n\n this.currentOffset = offset;\n\n return true;\n }\n\n private isBaseElementVisible(): boolean {\n return isOffsetPartiallyVisibleWithinParent(\n this.getImmediateOverflowParent(),\n {\n top: this.baseRect.top,\n left: this.baseRect.left,\n right: this.baseRect.right,\n bottom: this.baseRect.bottom,\n },\n this.config.autoFitOverflowOffset\n );\n }\n\n private addScrollListeners(): void {\n this.scrollListeners = this.overflowParents.map((parentElement) => {\n const overflow =\n parentElement === document.body ? 'window' : parentElement;\n return this.renderer.listen(overflow, 'scroll', () => {\n this.affix();\n this._overflowScroll.next();\n });\n });\n }\n\n private addResizeListener(): void {\n this.resizeListener = fromEvent(window, 'resize').subscribe(() =>\n this.affix()\n );\n }\n\n private removeResizeListener(): void {\n if (this.resizeListener) {\n this.resizeListener.unsubscribe();\n this.resizeListener = undefined;\n }\n }\n\n private removeScrollListeners(): void {\n if (this.scrollListeners) {\n // Remove renderer-generated listeners by calling the listener itself.\n // https://github.com/angular/angular/issues/9368#issuecomment-227199778\n this.scrollListeners.forEach((listener) => listener());\n this.scrollListeners = undefined;\n }\n }\n}\n"]}
|
@@ -0,0 +1,77 @@
|
|
1
|
+
/**
|
2
|
+
* Returns the offset values of a given element.
|
3
|
+
* @param element The HTML element.
|
4
|
+
* @param bufferOffset An optional offset to add/subtract to the element's actual offset.
|
5
|
+
*/
|
6
|
+
export function getElementOffset(element, bufferOffset = {}) {
|
7
|
+
const bufferOffsetBottom = bufferOffset.bottom || 0;
|
8
|
+
const bufferOffsetLeft = bufferOffset.left || 0;
|
9
|
+
const bufferOffsetRight = bufferOffset.right || 0;
|
10
|
+
const bufferOffsetTop = bufferOffset.top || 0;
|
11
|
+
let top;
|
12
|
+
let left;
|
13
|
+
let right;
|
14
|
+
let bottom;
|
15
|
+
if (element === document.body) {
|
16
|
+
left = 0;
|
17
|
+
top = 0;
|
18
|
+
right = document.documentElement.clientWidth;
|
19
|
+
bottom = document.documentElement.clientHeight;
|
20
|
+
}
|
21
|
+
else {
|
22
|
+
const clientRect = element.getBoundingClientRect();
|
23
|
+
left = clientRect.left;
|
24
|
+
top = clientRect.top;
|
25
|
+
right = clientRect.right;
|
26
|
+
bottom = clientRect.bottom;
|
27
|
+
}
|
28
|
+
bottom -= bufferOffsetBottom;
|
29
|
+
left += bufferOffsetLeft;
|
30
|
+
right -= bufferOffsetRight;
|
31
|
+
top += bufferOffsetTop;
|
32
|
+
return {
|
33
|
+
bottom,
|
34
|
+
left,
|
35
|
+
right,
|
36
|
+
top,
|
37
|
+
};
|
38
|
+
}
|
39
|
+
export function getOverflowParents(child) {
|
40
|
+
const bodyElement = window.document.body;
|
41
|
+
const results = [bodyElement];
|
42
|
+
let parentElement = child.parentNode;
|
43
|
+
while (parentElement !== undefined &&
|
44
|
+
parentElement !== bodyElement &&
|
45
|
+
parentElement instanceof HTMLElement) {
|
46
|
+
const overflowY = window
|
47
|
+
.getComputedStyle(parentElement, undefined)
|
48
|
+
.overflowY.toLowerCase();
|
49
|
+
if (overflowY === 'auto' ||
|
50
|
+
overflowY === 'hidden' ||
|
51
|
+
overflowY === 'scroll') {
|
52
|
+
results.push(parentElement);
|
53
|
+
}
|
54
|
+
parentElement = parentElement.parentNode;
|
55
|
+
}
|
56
|
+
return results;
|
57
|
+
}
|
58
|
+
/**
|
59
|
+
* Confirms offset is fully visible within a parent element.
|
60
|
+
* @param parent
|
61
|
+
* @param offset
|
62
|
+
*/
|
63
|
+
export function isOffsetFullyVisibleWithinParent(parent, offset, bufferOffset) {
|
64
|
+
const parentOffset = getElementOffset(parent, bufferOffset);
|
65
|
+
return !(parentOffset.top > offset.top ||
|
66
|
+
parentOffset.right < offset.right ||
|
67
|
+
parentOffset.bottom < offset.bottom ||
|
68
|
+
parentOffset.left > offset.left);
|
69
|
+
}
|
70
|
+
export function isOffsetPartiallyVisibleWithinParent(parent, offset, bufferOffset) {
|
71
|
+
const parentOffset = getElementOffset(parent, bufferOffset);
|
72
|
+
return !(parentOffset.top >= offset.bottom ||
|
73
|
+
parentOffset.right <= offset.left ||
|
74
|
+
parentOffset.bottom <= offset.top ||
|
75
|
+
parentOffset.left >= offset.right);
|
76
|
+
}
|
77
|
+
//# sourceMappingURL=dom-utils.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dom-utils.js","sourceRoot":"","sources":["../../../../../../../../libs/components/core/src/lib/modules/affix/dom-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { SkyAffixOffset } from './affix-offset';\n\n/**\n * Returns the offset values of a given element.\n * @param element The HTML element.\n * @param bufferOffset An optional offset to add/subtract to the element's actual offset.\n */\nexport function getElementOffset(\n element: HTMLElement,\n bufferOffset: SkyAffixOffset = {}\n): SkyAffixOffset {\n const bufferOffsetBottom = bufferOffset.bottom || 0;\n const bufferOffsetLeft = bufferOffset.left || 0;\n const bufferOffsetRight = bufferOffset.right || 0;\n const bufferOffsetTop = bufferOffset.top || 0;\n\n let top: number;\n let left: number;\n let right: number;\n let bottom: number;\n\n if (element === document.body) {\n left = 0;\n top = 0;\n right = document.documentElement.clientWidth;\n bottom = document.documentElement.clientHeight;\n } else {\n const clientRect = element.getBoundingClientRect();\n left = clientRect.left;\n top = clientRect.top;\n right = clientRect.right;\n bottom = clientRect.bottom;\n }\n\n bottom -= bufferOffsetBottom;\n left += bufferOffsetLeft;\n right -= bufferOffsetRight;\n top += bufferOffsetTop;\n\n return {\n bottom,\n left,\n right,\n top,\n };\n}\n\nexport function getOverflowParents(child: HTMLElement): HTMLElement[] {\n const bodyElement = window.document.body;\n const results = [bodyElement];\n\n let parentElement = child.parentNode;\n\n while (\n parentElement !== undefined &&\n parentElement !== bodyElement &&\n parentElement instanceof HTMLElement\n ) {\n const overflowY = window\n .getComputedStyle(parentElement, undefined)\n .overflowY.toLowerCase();\n\n if (\n overflowY === 'auto' ||\n overflowY === 'hidden' ||\n overflowY === 'scroll'\n ) {\n results.push(parentElement);\n }\n\n parentElement = parentElement.parentNode;\n }\n\n return results;\n}\n\n/**\n * Confirms offset is fully visible within a parent element.\n * @param parent\n * @param offset\n */\nexport function isOffsetFullyVisibleWithinParent(\n parent: HTMLElement,\n offset: SkyAffixOffset,\n bufferOffset?: SkyAffixOffset\n): boolean {\n const parentOffset = getElementOffset(parent, bufferOffset);\n\n return !(\n parentOffset.top > offset.top ||\n parentOffset.right < offset.right ||\n parentOffset.bottom < offset.bottom ||\n parentOffset.left > offset.left\n );\n}\n\nexport function isOffsetPartiallyVisibleWithinParent(\n parent: HTMLElement,\n offset: SkyAffixOffset,\n bufferOffset?: SkyAffixOffset\n): boolean {\n const parentOffset = getElementOffset(parent, bufferOffset);\n\n return !(\n parentOffset.top >= offset.bottom ||\n parentOffset.right <= offset.left ||\n parentOffset.bottom <= offset.top ||\n parentOffset.left >= offset.right\n );\n}\n"]}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
import { Injectable, RendererFactory2, } from '@angular/core';
|
2
|
+
import { fromEvent as observableFromEvent, Subject } from 'rxjs';
|
3
|
+
import { debounceTime, takeUntil } from 'rxjs/operators';
|
4
|
+
import { MutationObserverService } from '../mutation/mutation-observer-service';
|
5
|
+
import * as i0 from "@angular/core";
|
6
|
+
import * as i1 from "../mutation/mutation-observer-service";
|
7
|
+
/**
|
8
|
+
* @internal
|
9
|
+
*/
|
10
|
+
export class SkyDockDomAdapterService {
|
11
|
+
constructor(mutationService, rendererFactory) {
|
12
|
+
this.mutationService = mutationService;
|
13
|
+
this.ngUnsubscribe = new Subject();
|
14
|
+
this.renderer = rendererFactory.createRenderer(undefined, undefined);
|
15
|
+
}
|
16
|
+
ngOnDestroy() {
|
17
|
+
if (this.observer) {
|
18
|
+
this.observer.disconnect();
|
19
|
+
}
|
20
|
+
this.ngUnsubscribe.next();
|
21
|
+
if (this.styleElement) {
|
22
|
+
this.destroyStyleElement();
|
23
|
+
}
|
24
|
+
this.currentDockHeight =
|
25
|
+
this.ngUnsubscribe =
|
26
|
+
this.observer =
|
27
|
+
this.styleElement =
|
28
|
+
undefined;
|
29
|
+
}
|
30
|
+
setSticky(elementRef) {
|
31
|
+
this.renderer.addClass(elementRef.nativeElement, 'sky-dock-sticky');
|
32
|
+
}
|
33
|
+
setZIndex(zIndex, elementRef) {
|
34
|
+
this.renderer.setStyle(elementRef.nativeElement, 'z-index', zIndex);
|
35
|
+
}
|
36
|
+
unbindDock(elementRef) {
|
37
|
+
this.renderer.addClass(elementRef.nativeElement, 'sky-dock-unbound');
|
38
|
+
}
|
39
|
+
watchDomChanges(elementRef) {
|
40
|
+
this.observer = this.mutationService.create(() => {
|
41
|
+
this.adjustBodyStyles(elementRef);
|
42
|
+
});
|
43
|
+
this.observer.observe(elementRef.nativeElement, {
|
44
|
+
attributes: true,
|
45
|
+
childList: true,
|
46
|
+
characterData: true,
|
47
|
+
subtree: true,
|
48
|
+
});
|
49
|
+
observableFromEvent(window, 'resize')
|
50
|
+
.pipe(debounceTime(250), takeUntil(this.ngUnsubscribe))
|
51
|
+
.subscribe(() => this.adjustBodyStyles(elementRef));
|
52
|
+
}
|
53
|
+
adjustBodyStyles(elementRef) {
|
54
|
+
const dockHeight = elementRef.nativeElement.getBoundingClientRect().height;
|
55
|
+
if (dockHeight === this.currentDockHeight) {
|
56
|
+
return;
|
57
|
+
}
|
58
|
+
// Create a style element to avoid overwriting any existing inline body styles.
|
59
|
+
const styleElement = this.renderer.createElement('style');
|
60
|
+
const textNode = this.renderer.createText(`body { margin-bottom: ${dockHeight}px; }`);
|
61
|
+
// Apply a `data-` attribute to make unit testing easier.
|
62
|
+
this.renderer.setAttribute(styleElement, 'data-test-selector', 'sky-layout-dock-bottom-styles');
|
63
|
+
this.renderer.appendChild(styleElement, textNode);
|
64
|
+
this.renderer.appendChild(document.head, styleElement);
|
65
|
+
if (this.styleElement) {
|
66
|
+
this.destroyStyleElement();
|
67
|
+
}
|
68
|
+
this.currentDockHeight = dockHeight;
|
69
|
+
this.styleElement = styleElement;
|
70
|
+
}
|
71
|
+
destroyStyleElement() {
|
72
|
+
this.renderer.removeChild(document.head, this.styleElement);
|
73
|
+
}
|
74
|
+
}
|
75
|
+
SkyDockDomAdapterService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyDockDomAdapterService, deps: [{ token: i1.MutationObserverService }, { token: i0.RendererFactory2 }], target: i0.ɵɵFactoryTarget.Injectable });
|
76
|
+
SkyDockDomAdapterService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyDockDomAdapterService });
|
77
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: SkyDockDomAdapterService, decorators: [{
|
78
|
+
type: Injectable
|
79
|
+
}], ctorParameters: function () { return [{ type: i1.MutationObserverService }, { type: i0.RendererFactory2 }]; } });
|
80
|
+
//# sourceMappingURL=dock-dom-adapter.service.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dock-dom-adapter.service.js","sourceRoot":"","sources":["../../../../../../../../libs/components/core/src/lib/modules/dock/dock-dom-adapter.service.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ElementRef,\n Injectable,\n OnDestroy,\n Renderer2,\n RendererFactory2,\n} from '@angular/core';\n\nimport { fromEvent as observableFromEvent, Subject } from 'rxjs';\n\nimport { debounceTime, takeUntil } from 'rxjs/operators';\n\nimport { MutationObserverService } from '../mutation/mutation-observer-service';\n\n/**\n * @internal\n */\n@Injectable()\nexport class SkyDockDomAdapterService implements OnDestroy {\n private currentDockHeight: number;\n\n private ngUnsubscribe = new Subject<void>();\n\n private observer: MutationObserver;\n\n private renderer: Renderer2;\n\n private styleElement: HTMLStyleElement;\n\n constructor(\n private mutationService: MutationObserverService,\n rendererFactory: RendererFactory2\n ) {\n this.renderer = rendererFactory.createRenderer(undefined, undefined);\n }\n\n public ngOnDestroy(): void {\n if (this.observer) {\n this.observer.disconnect();\n }\n this.ngUnsubscribe.next();\n\n if (this.styleElement) {\n this.destroyStyleElement();\n }\n\n this.currentDockHeight =\n this.ngUnsubscribe =\n this.observer =\n this.styleElement =\n undefined;\n }\n\n public setSticky(elementRef: ElementRef): void {\n this.renderer.addClass(elementRef.nativeElement, 'sky-dock-sticky');\n }\n\n public setZIndex(zIndex: number, elementRef: ElementRef): void {\n this.renderer.setStyle(elementRef.nativeElement, 'z-index', zIndex);\n }\n\n public unbindDock(elementRef: ElementRef): void {\n this.renderer.addClass(elementRef.nativeElement, 'sky-dock-unbound');\n }\n\n public watchDomChanges(elementRef: ElementRef): void {\n this.observer = this.mutationService.create(() => {\n this.adjustBodyStyles(elementRef);\n });\n\n this.observer.observe(elementRef.nativeElement, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true,\n });\n\n observableFromEvent(window, 'resize')\n .pipe(debounceTime(250), takeUntil(this.ngUnsubscribe))\n .subscribe(() => this.adjustBodyStyles(elementRef));\n }\n\n private adjustBodyStyles(elementRef: ElementRef): void {\n const dockHeight = elementRef.nativeElement.getBoundingClientRect().height;\n if (dockHeight === this.currentDockHeight) {\n return;\n }\n\n // Create a style element to avoid overwriting any existing inline body styles.\n const styleElement = this.renderer.createElement('style');\n const textNode = this.renderer.createText(\n `body { margin-bottom: ${dockHeight}px; }`\n );\n\n // Apply a `data-` attribute to make unit testing easier.\n this.renderer.setAttribute(\n styleElement,\n 'data-test-selector',\n 'sky-layout-dock-bottom-styles'\n );\n\n this.renderer.appendChild(styleElement, textNode);\n this.renderer.appendChild(document.head, styleElement);\n\n if (this.styleElement) {\n this.destroyStyleElement();\n }\n\n this.currentDockHeight = dockHeight;\n this.styleElement = styleElement;\n }\n\n private destroyStyleElement(): void {\n this.renderer.removeChild(document.head, this.styleElement);\n }\n}\n"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dock-insert-component-config.js","sourceRoot":"","sources":["../../../../../../../../libs/components/core/src/lib/modules/dock/dock-insert-component-config.ts"],"names":[],"mappings":"","sourcesContent":["import { StaticProvider } from '@angular/core';\n\nimport { SkyDockItemConfig } from './dock-item-config';\n\nexport interface SkyDockInsertComponentConfig extends SkyDockItemConfig {\n /**\n * Static providers to inject into the item's component.\n */\n providers?: StaticProvider[];\n}\n"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dock-item-config.js","sourceRoot":"","sources":["../../../../../../../../libs/components/core/src/lib/modules/dock/dock-item-config.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Configuration to be used by the docking action.\n */\nexport interface SkyDockItemConfig {\n /**\n * The stack order of the item. The higher the number, the higher\n * the item will be placed in the dock. By default, new items will be placed at\n * the top of the stack.\n */\n stackOrder?: number;\n}\n"]}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dock-item-reference.js","sourceRoot":"","sources":["../../../../../../../../libs/components/core/src/lib/modules/dock/dock-item-reference.ts"],"names":[],"mappings":"","sourcesContent":["import { ComponentRef } from '@angular/core';\n\n/**\n * Represents a dock item's component reference.\n * @internal\n */\nexport interface SkyDockItemReference<T> {\n componentRef: ComponentRef<T>;\n\n stackOrder: number;\n}\n"]}
|