ngx-scrolltop
Version:
Lightweight, Material Design inspired button for scroll-to-top of the page. No dependencies. Pure Angular!
1 lines • 12.4 kB
Source Map (JSON)
{"version":3,"file":"ngx-scrolltop.mjs","sources":["../../../projects/ngx-scrolltop/src/lib/ngx-scrolltop.core.service.ts","../../../projects/ngx-scrolltop/src/lib/ngx-scrolltop.component.ts","../../../projects/ngx-scrolltop/src/lib/ngx-scrolltop.component.html","../../../projects/ngx-scrolltop/src/lib/ngx-scrolltop.directive.ts","../../../projects/ngx-scrolltop/src/lib/ngx-scrolltop.module.ts","../../../projects/ngx-scrolltop/src/public-api.ts","../../../projects/ngx-scrolltop/src/ngx-scrolltop.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable, signal } from '@angular/core';\nimport { polyfill as smoothscrollPolyfill } from 'seamless-scroll-polyfill';\nimport { NgxScrollTopMode } from './ngx-scrolltop.interface';\n\n@Injectable()\nexport class NgxScrollTopCoreService {\n private scrolledFromTop = signal(false);\n private scrollOffset = signal(0);\n private readonly isBrowser: boolean = typeof window !== 'undefined';\n private alreadyActivated = signal(false);\n\n private document = inject(DOCUMENT);\n\n public onWindowScroll(mode: NgxScrollTopMode): boolean {\n const position: number =\n this.document.documentElement?.scrollTop || this.document.scrollingElement?.scrollTop;\n switch (mode) {\n case 'classic':\n return this.classicMode(position);\n case 'smart':\n return this.smartMode(position);\n }\n }\n\n private classicMode(position: number): boolean {\n if (this.isBrowser && position > window.innerHeight) {\n return true;\n } else {\n return false;\n }\n }\n\n private smartMode(position: number): boolean {\n let show = false;\n\n if (position === 0) {\n show = false;\n this.scrolledFromTop.set(false);\n }\n\n if (this.scrolledFromTop() && this.scrollOffset() > position) {\n show = true;\n }\n\n if (this.isBrowser && position > window.innerHeight * 2) {\n this.scrolledFromTop.set(true);\n this.scrollOffset.set(position);\n }\n\n return show;\n }\n\n public scrollToTop(): void {\n if (this.isBrowser) {\n // Kick off the polyfill for iOS Safari\n if (!this.alreadyActivated()) {\n smoothscrollPolyfill();\n this.alreadyActivated.set(true);\n }\n // Scroll to the top\n window.scroll({ top: 0, left: 0, behavior: 'smooth' });\n }\n }\n}\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n HostListener,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { NgxScrollTopCoreService } from './ngx-scrolltop.core.service';\nimport {\n NgxScrollTopMode,\n NgxScrollTopPosition,\n NgxScrollTopTheme,\n} from './ngx-scrolltop.interface';\n\n@Component({\n selector: 'ngx-scrolltop',\n templateUrl: './ngx-scrolltop.component.html',\n styleUrls: ['./ngx-scrolltop.component.scss'],\n imports: [NgClass],\n providers: [NgxScrollTopCoreService],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n})\nexport class NgxScrollTopComponent {\n public backgroundColor = input<string>();\n public symbolColor = input<string>();\n public size = input<number>();\n public position = input<NgxScrollTopPosition>('right');\n public theme = input<NgxScrollTopTheme>('gray');\n public mode = input<NgxScrollTopMode>('classic');\n\n public show = signal(false);\n\n private readonly core = inject(NgxScrollTopCoreService);\n\n @HostListener('window:scroll')\n public onWindowScroll(): void {\n const show = this.core.onWindowScroll(this.mode());\n\n // Performance boost. Only update the state if it has changed.\n if (this.show() !== show) {\n this.show.set(show);\n }\n }\n\n public scrollToTop(): void {\n this.core.scrollToTop();\n }\n}\n","@if (show()) {\n <button\n type=\"button\"\n role=\"button\"\n aria-label=\"Scroll to top of the page\"\n tabindex=\"0\"\n class=\"scrolltop-button\"\n #scrollTopButton\n (click)=\"scrollToTop()\"\n [ngClass]=\"theme()\"\n [style.left]=\"position() === 'left' ? '20px' : ''\"\n [style.backgroundColor]=\"backgroundColor()\"\n [style.width.px]=\"size()\"\n [style.height.px]=\"size()\">\n <div class=\"symbol-container\">\n <span #ref>\n <ng-content></ng-content>\n </span>\n @if (ref.childNodes.length === 0) {\n <svg \n aria-hidden=\"true\"\n [style.fill]=\"symbolColor()\"\n focusable=\"false\"\n role=\"img\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 448 512\">\n <path\n d=\"M240.971 130.524l194.343 194.343c9.373 9.373 9.373 24.569 0 33.941l-22.667 22.667c-9.357 9.357-24.522 9.375-33.901.04L224 227.495 69.255 381.516c-9.379 9.335-24.544 9.317-33.901-.04l-22.667-22.667c-9.373-9.373-9.373-24.569 0-33.941L207.03 130.525c9.372-9.373 24.568-9.373 33.941-.001z\">\n </path>\n </svg>\n }\n </div>\n </button>\n}","import { Directive, ElementRef, HostListener, inject, input, signal } from '@angular/core';\nimport { NgxScrollTopCoreService } from './ngx-scrolltop.core.service';\nimport { NgxScrollTopMode } from './ngx-scrolltop.interface';\n\n@Directive({\n selector: '[ngxScrollTop]',\n standalone: true,\n providers: [NgxScrollTopCoreService],\n})\nexport class NgxScrollTopDirective {\n public mode = input<NgxScrollTopMode>('classic', { alias: 'ngxScrollTopMode' });\n\n private show = signal(false);\n\n private el = inject(ElementRef);\n private core = inject(NgxScrollTopCoreService);\n\n constructor() {\n this.hideElement();\n }\n\n @HostListener('window:scroll')\n public onWindowScroll(): void {\n const show = this.core.onWindowScroll(this.mode());\n\n // Performance boost. Only update the DOM when the state changes.\n if (this.show() !== show) {\n show ? this.showElement() : this.hideElement();\n this.show.set(show);\n }\n }\n\n @HostListener('click')\n public onClick(): void {\n this.scrollToTop();\n }\n\n private hideElement(): void {\n this.el.nativeElement.style.display = 'none';\n }\n\n private showElement(): void {\n this.el.nativeElement.style.display = '';\n }\n\n private scrollToTop(): void {\n this.core.scrollToTop();\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { NgxScrollTopComponent } from './ngx-scrolltop.component';\nimport { NgxScrollTopCoreService } from './ngx-scrolltop.core.service';\nimport { NgxScrollTopDirective } from './ngx-scrolltop.directive';\n\n@NgModule({\n imports: [CommonModule, NgxScrollTopComponent, NgxScrollTopDirective],\n providers: [NgxScrollTopCoreService],\n exports: [NgxScrollTopComponent, NgxScrollTopDirective],\n})\nexport class NgxScrollTopModule { }\n","/*\n * Public API Surface of ngx-scrolltop\n */\n\nexport * from './lib/ngx-scrolltop.component';\nexport * from './lib/ngx-scrolltop.directive';\nexport * from './lib/ngx-scrolltop.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["smoothscrollPolyfill"],"mappings":"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"}