UNPKG

ngx-drag-scroll

Version:

Lightweight drag to scroll library for Angular

1 lines 50.5 kB
{"version":3,"file":"ngx-drag-scroll.mjs","sources":["../../../projects/ngx-drag-scroll/src/lib/ngx-drag-scroll-item.ts","../../../projects/ngx-drag-scroll/src/lib/ngx-drag-scroll.component.ts","../../../projects/ngx-drag-scroll/src/public-api.ts","../../../projects/ngx-drag-scroll/src/ngx-drag-scroll.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n HostBinding,\n inject,\n input\n} from '@angular/core';\n\n@Directive({\n selector: '[drag-scroll-item]'\n})\nexport class DragScrollItemDirective {\n @HostBinding('style.display')\n display = 'inline-block';\n\n dragDisabled = input<boolean>(false, { alias: 'drag-disabled' });\n\n elementRef = inject(ElementRef);\n}\n","import {\n AfterViewChecked,\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n ElementRef,\n HostBinding,\n HostListener,\n Inject,\n OnChanges,\n OnDestroy,\n QueryList,\n Renderer2,\n ViewChild,\n input,\n output\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nimport { DragScrollItemDirective } from './ngx-drag-scroll-item';\n\n@Component({\n selector: 'drag-scroll',\n template: `\n <div class=\"drag-scroll-content\" #contentRef>\n <ng-content></ng-content>\n </div>\n `,\n styles: [\n `\n :host {\n overflow: hidden;\n display: block;\n }\n .drag-scroll-content {\n height: 100%;\n overflow: auto;\n white-space: nowrap;\n }\n `\n ],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DragScrollComponent\n implements OnDestroy, AfterViewInit, OnChanges, AfterViewChecked\n{\n private _index = 0;\n\n private _isDragging = false;\n\n private _onMouseMoveListener: () => void | null = null;\n\n private _onMouseUpListener: () => void | null = null;\n\n private _onMouseDownListener: () => void | null = null;\n\n private _onScrollListener: () => void | null = null;\n\n private _onDragStartListener: () => void | null = null;\n\n /**\n * Is the user currently pressing the element\n */\n isPressed = false;\n\n /**\n * Is the user currently scrolling the element\n */\n isScrolling = false;\n\n scrollTimer: number | NodeJS.Timer = -1;\n\n scrollToTimer: number | NodeJS.Timer = -1;\n\n /**\n * Is the user currently dragging the element\n */\n get isDragging(): boolean {\n return this._isDragging;\n }\n\n /**\n * The x coordinates on the element\n */\n downX = 0;\n\n /**\n * The y coordinates on the element\n */\n downY = 0;\n\n displayType: string | null = 'block';\n\n elWidth: string | null = null;\n\n elHeight: string | null = null;\n\n /**\n * The parentNode of carousel Element\n */\n parentNode: HTMLElement;\n\n /**\n * The carousel Element\n */\n\n @ViewChild('contentRef', { static: true }) _contentRef: ElementRef;\n\n @ContentChildren(DragScrollItemDirective, { descendants: true })\n _children: QueryList<DragScrollItemDirective>;\n\n @HostBinding('style.pointer-events') _pointerEvents = 'auto';\n\n wrapper: HTMLDivElement | null;\n\n scrollbarWidth: string | null = null;\n\n get currIndex() {\n return this._index;\n }\n set currIndex(value) {\n if (value !== this._index) {\n this._index = value;\n this.indexChanged.emit(value);\n }\n }\n\n isAnimating = false;\n\n prevChildrenLength = 0;\n\n indexBound = 0;\n\n rtl = false;\n\n dsInitialized = output<void>();\n\n indexChanged = output<number>();\n\n reachesLeftBound = output<boolean>();\n\n reachesRightBound = output<boolean>();\n\n snapAnimationFinished = output<number>();\n\n dragStart = output<void>();\n\n dragEnd = output<void>();\n\n /**\n * Whether the scrollbar is hidden\n */\n scrollbarHidden = input<boolean>(false, { alias: 'scrollbar-hidden' });\n\n /**\n * Whether horizontally and vertically draging and scrolling is be disabled\n */\n disabled = input<boolean>(false, { alias: 'drag-scroll-disabled' });\n\n /**\n * Whether horizontally dragging and scrolling is be disabled\n */\n xDisabled = input<boolean>(false, { alias: 'drag-scroll-x-disabled' });\n\n /**\n * Whether vertically dragging and scrolling events is disabled\n */\n yDisabled = input<boolean>(false, { alias: 'drag-scroll-y-disabled' });\n\n /**\n * Whether scrolling horizontally with mouse wheel is enabled\n */\n xWheelEnabled = input<boolean>(false, { alias: 'scroll-x-wheel-enabled' });\n\n dragDisabled = input<boolean>(false, { alias: 'drag-disabled' });\n\n snapDisabled = input<boolean>(false, { alias: 'snap-disabled' });\n\n snapOffset = input<number>(0, { alias: 'snap-offset' });\n\n snapDuration = input<number>(500, { alias: 'snap-duration' });\n\n constructor(\n private _elementRef: ElementRef,\n private _renderer: Renderer2,\n @Inject(DOCUMENT) private _document: Document\n ) {\n this.scrollbarWidth = `${this.getScrollbarWidth()}px`;\n }\n\n ngOnChanges() {\n this.setScrollBar();\n\n if (this.xDisabled() || this.disabled() || this.scrollbarHidden()) {\n this.disableScroll('x');\n } else {\n this.enableScroll('x');\n }\n\n if (this.yDisabled() || this.disabled()) {\n this.disableScroll('y');\n } else {\n this.enableScroll('y');\n }\n }\n\n ngAfterViewInit() {\n // auto assign computed css\n this._renderer.setAttribute(\n this._contentRef.nativeElement,\n 'drag-scroll',\n 'true'\n );\n\n this.displayType =\n typeof window !== 'undefined'\n ? window.getComputedStyle(this._elementRef.nativeElement).display\n : 'block';\n\n this._renderer.setStyle(\n this._contentRef.nativeElement,\n 'display',\n this.displayType\n );\n this._renderer.setStyle(\n this._contentRef.nativeElement,\n 'whiteSpace',\n 'noWrap'\n );\n\n // store ele width height for later user\n this.markElDimension();\n\n this._renderer.setStyle(\n this._contentRef.nativeElement,\n 'width',\n this.elWidth\n );\n this._renderer.setStyle(\n this._contentRef.nativeElement,\n 'height',\n this.elHeight\n );\n\n if (this.wrapper) {\n this.checkScrollbar();\n }\n\n this._onMouseDownListener = this._renderer.listen(\n this._contentRef.nativeElement,\n 'mousedown',\n this.onMouseDownHandler.bind(this)\n );\n this._onScrollListener = this._renderer.listen(\n this._contentRef.nativeElement,\n 'scroll',\n this.onScrollHandler.bind(this)\n );\n // prevent Firefox from dragging images\n this._onDragStartListener = this._renderer.listen(\n this._contentRef.nativeElement,\n 'dragstart',\n (e) => {\n e.preventDefault();\n }\n );\n this.checkNavStatus();\n this.dsInitialized.emit();\n this.adjustMarginToLastChild();\n\n this.rtl =\n getComputedStyle(this._contentRef.nativeElement).getPropertyValue(\n 'direction'\n ) === 'rtl';\n }\n\n ngAfterViewChecked() {\n // avoid extra checks\n if (this._children.length !== this.prevChildrenLength) {\n this.markElDimension();\n this.checkScrollbar();\n this.prevChildrenLength = this._children.length;\n this.checkNavStatus();\n }\n }\n\n ngOnDestroy() {\n this._renderer.setAttribute(\n this._contentRef.nativeElement,\n 'drag-scroll',\n 'false'\n );\n if (this._onMouseDownListener) {\n this._onMouseDownListener();\n this._onMouseDownListener = null;\n }\n if (this._onScrollListener) {\n this._onScrollListener();\n this._onScrollListener = null;\n }\n if (this._onDragStartListener) {\n this._onDragStartListener();\n this._onDragStartListener = null;\n }\n }\n\n onMouseMoveHandler(event: MouseEvent) {\n this.onMouseMove(event);\n }\n\n onMouseMove(event: MouseEvent) {\n if (event.clientX === this.downX && event.clientY === this.downY) {\n // Ignore 'mousemove\" event triggered at the same coordinates that the last mousedown event (consequence of window resize)\n return;\n }\n if (this.isPressed && !this.disabled()) {\n // Workaround for prevent scroll stuck if browser lost focus\n // MouseEvent.buttons not support by Safari\n if (!event.buttons && !event.which) {\n return this.onMouseUpHandler();\n }\n\n this._pointerEvents = 'none';\n this._setIsDragging(true);\n\n // Drag X\n if (!this.xDisabled() && !this.dragDisabled()) {\n const clientX = (event as MouseEvent).clientX;\n this._contentRef.nativeElement.scrollLeft =\n this._contentRef.nativeElement.scrollLeft - clientX + this.downX;\n this.downX = clientX;\n }\n\n // Drag Y\n if (!this.yDisabled() && !this.dragDisabled()) {\n const clientY = (event as MouseEvent).clientY;\n this._contentRef.nativeElement.scrollTop =\n this._contentRef.nativeElement.scrollTop - clientY + this.downY;\n this.downY = clientY;\n }\n }\n }\n\n onMouseDownHandler(event: MouseEvent) {\n const dragScrollItem: DragScrollItemDirective | null =\n this.locateDragScrollItem(event.target as Element);\n if (dragScrollItem && dragScrollItem.dragDisabled()) {\n return;\n }\n\n const isTouchEvent = event.type === 'touchstart';\n\n this._startGlobalListening(isTouchEvent);\n this.isPressed = true;\n\n const mouseEvent = event as MouseEvent;\n this.downX = mouseEvent.clientX;\n this.downY = mouseEvent.clientY;\n\n clearTimeout(this.scrollToTimer as number);\n }\n\n onScrollHandler() {\n this.checkNavStatus();\n if (!this.isPressed && !this.isAnimating && !this.snapDisabled()) {\n this.isScrolling = true;\n clearTimeout(this.scrollTimer as number);\n this.scrollTimer = setTimeout(() => {\n this.isScrolling = false;\n this.locateCurrentIndex(true);\n }, 500);\n } else {\n this.locateCurrentIndex();\n }\n }\n\n onMouseUpHandler() {\n if (this.isPressed) {\n this.isPressed = false;\n this._pointerEvents = 'auto';\n this._setIsDragging(false);\n if (!this.snapDisabled()) {\n this.locateCurrentIndex(true);\n } else {\n this.locateCurrentIndex();\n }\n this.stopGlobalListening();\n }\n }\n\n /*\n * Nav button\n */\n moveLeft() {\n if (this.currIndex !== 0 || this.snapDisabled()) {\n this.currIndex--;\n clearTimeout(this.scrollToTimer as number);\n this.scrollTo(\n this._contentRef.nativeElement,\n this.toChildrenLocation(),\n this.snapDuration()\n );\n }\n }\n\n moveRight() {\n const container = this.wrapper || this.parentNode;\n const containerWidth = container ? container.clientWidth : 0;\n\n if (\n !this.isScrollReachesRightEnd() &&\n this.currIndex <\n this.maximumIndex(containerWidth, this._children.toArray())\n ) {\n this.currIndex++;\n clearTimeout(this.scrollToTimer as number);\n this.scrollTo(\n this._contentRef.nativeElement,\n this.toChildrenLocation(),\n this.snapDuration()\n );\n }\n }\n\n moveTo(index: number) {\n const container = this.wrapper || this.parentNode;\n const containerWidth = container ? container.clientWidth : 0;\n if (\n index >= 0 &&\n index !== this.currIndex &&\n this.currIndex <=\n this.maximumIndex(containerWidth, this._children.toArray())\n ) {\n this.currIndex = Math.min(\n index,\n this.maximumIndex(containerWidth, this._children.toArray())\n );\n clearTimeout(this.scrollToTimer as number);\n this.scrollTo(\n this._contentRef.nativeElement,\n this.toChildrenLocation(),\n this.snapDuration()\n );\n }\n }\n\n checkNavStatus() {\n setTimeout(() => {\n const onlyOneItem = Boolean(this._children.length <= 1);\n const containerIsLargerThanContent = Boolean(\n this._contentRef.nativeElement.scrollWidth <=\n this._contentRef.nativeElement.clientWidth\n );\n if (onlyOneItem || containerIsLargerThanContent) {\n // only one element\n this.reachesLeftBound.emit(true);\n this.reachesRightBound.emit(true);\n } else if (this.isScrollReachesRightEnd()) {\n // reached right end\n this.reachesLeftBound.emit(false);\n this.reachesRightBound.emit(true);\n } else if (\n this._contentRef.nativeElement.scrollLeft === 0 &&\n this._contentRef.nativeElement.scrollWidth >\n this._contentRef.nativeElement.clientWidth\n ) {\n // reached left end\n this.reachesLeftBound.emit(true);\n this.reachesRightBound.emit(false);\n } else {\n // in the middle\n this.reachesLeftBound.emit(false);\n this.reachesRightBound.emit(false);\n }\n }, 0);\n }\n\n @HostListener('wheel', ['$event'])\n public onWheel(event: WheelEvent) {\n if (this.xWheelEnabled()) {\n event.preventDefault();\n\n if (this.snapDisabled()) {\n this._contentRef.nativeElement.scrollBy(event.deltaY, 0);\n } else {\n if (event.deltaY < 0) {\n this.moveLeft();\n } else if (event.deltaY > 0) {\n this.moveRight();\n }\n }\n }\n }\n\n @HostListener('window:resize')\n public onWindowResize() {\n this.refreshWrapperDimensions();\n this.checkNavStatus();\n }\n\n private _setIsDragging(value: boolean) {\n if (this._isDragging === value) {\n return;\n }\n\n this._isDragging = value;\n if (value) {\n this.dragStart.emit();\n } else {\n this.dragEnd.emit();\n }\n }\n\n private _startGlobalListening(isTouchEvent: boolean) {\n if (!this._onMouseMoveListener) {\n const eventName = isTouchEvent ? 'touchmove' : 'mousemove';\n this._onMouseMoveListener = this._renderer.listen(\n 'document',\n eventName,\n this.onMouseMoveHandler.bind(this)\n );\n }\n\n if (!this._onMouseUpListener) {\n const eventName = isTouchEvent ? 'touchend' : 'mouseup';\n this._onMouseUpListener = this._renderer.listen(\n 'document',\n eventName,\n this.onMouseUpHandler.bind(this)\n );\n }\n }\n\n private stopGlobalListening() {\n if (this._onMouseMoveListener) {\n this._onMouseMoveListener();\n this._onMouseMoveListener = null;\n }\n\n if (this._onMouseUpListener) {\n this._onMouseUpListener();\n this._onMouseUpListener = null;\n }\n }\n\n private disableScroll(axis: string): void {\n this._renderer.setStyle(\n this._contentRef.nativeElement,\n `overflow-${axis}`,\n 'hidden'\n );\n }\n\n private enableScroll(axis: string): void {\n this._renderer.setStyle(\n this._contentRef.nativeElement,\n `overflow-${axis}`,\n 'auto'\n );\n }\n\n private hideScrollbar(): void {\n if (\n this._contentRef.nativeElement.style.display !== 'none' &&\n !this.wrapper\n ) {\n this.parentNode = this._contentRef.nativeElement.parentNode;\n\n // create container element\n this.wrapper = this._renderer.createElement('div');\n this._renderer.setAttribute(this.wrapper, 'class', 'drag-scroll-wrapper');\n this._renderer.addClass(this.wrapper, 'drag-scroll-container');\n\n this.refreshWrapperDimensions();\n\n this._renderer.setStyle(this.wrapper, 'overflow', 'hidden');\n\n this._renderer.setStyle(\n this._contentRef.nativeElement,\n 'width',\n `calc(100% + ${this.scrollbarWidth})`\n );\n this._renderer.setStyle(\n this._contentRef.nativeElement,\n 'height',\n `calc(100% + ${this.scrollbarWidth})`\n );\n\n // Append container element to component element.\n this._renderer.appendChild(this._elementRef.nativeElement, this.wrapper);\n\n // Append content element to container element.\n this._renderer.appendChild(this.wrapper, this._contentRef.nativeElement);\n\n this.adjustMarginToLastChild();\n }\n }\n\n private showScrollbar(): void {\n if (this.wrapper) {\n this._renderer.setStyle(this._contentRef.nativeElement, 'width', '100%');\n this._renderer.setStyle(\n this._contentRef.nativeElement,\n 'height',\n this.wrapper.style.height\n );\n if (this.parentNode !== null) {\n this.parentNode.removeChild(this.wrapper);\n this.parentNode.appendChild(this._contentRef.nativeElement);\n }\n this.wrapper = null;\n\n this.adjustMarginToLastChild();\n }\n }\n\n private checkScrollbar() {\n if (\n this._contentRef.nativeElement.scrollWidth <=\n this._contentRef.nativeElement.clientWidth\n ) {\n this._renderer.setStyle(this._contentRef.nativeElement, 'height', '100%');\n } else {\n this._renderer.setStyle(\n this._contentRef.nativeElement,\n 'height',\n `calc(100% + ${this.scrollbarWidth})`\n );\n }\n if (\n this._contentRef.nativeElement.scrollHeight <=\n this._contentRef.nativeElement.clientHeight\n ) {\n this._renderer.setStyle(this._contentRef.nativeElement, 'width', '100%');\n } else {\n this._renderer.setStyle(\n this._contentRef.nativeElement,\n 'width',\n `calc(100% + ${this.scrollbarWidth})`\n );\n }\n }\n\n private setScrollBar(): void {\n if (this.scrollbarHidden()) {\n this.hideScrollbar();\n } else {\n this.showScrollbar();\n }\n }\n\n private getScrollbarWidth(): number {\n /**\n * Browser Scrollbar Widths (2016)\n * OSX (Chrome, Safari, Firefox) - 15px\n * Windows XP (IE7, Chrome, Firefox) - 17px\n * Windows 7 (IE10, IE11, Chrome, Firefox) - 17px\n * Windows 8.1 (IE11, Chrome, Firefox) - 17px\n * Windows 10 (IE11, Chrome, Firefox) - 17px\n * Windows 10 (Edge 12/13) - 12px\n */\n const outer = this._renderer.createElement('div');\n this._renderer.setStyle(outer, 'visibility', 'hidden');\n this._renderer.setStyle(outer, 'width', '100px');\n this._renderer.setStyle(outer, 'msOverflowStyle', 'scrollbar'); // needed for WinJS apps\n // document.body.appendChild(outer);\n this._renderer.appendChild(this._document.body, outer);\n // this._renderer.appendChild(this._renderer.selectRootElement('body'), outer);\n const widthNoScroll = outer.offsetWidth;\n // force scrollbars\n this._renderer.setStyle(outer, 'overflow', 'scroll');\n\n // add innerdiv\n const inner = this._renderer.createElement('div');\n this._renderer.setStyle(inner, 'width', '100%');\n this._renderer.appendChild(outer, inner);\n\n const widthWithScroll = inner.offsetWidth;\n\n // remove divs\n this._renderer.removeChild(this._document.body, outer);\n\n /**\n * Scrollbar width will be 0 on Mac OS with the\n * default \"Only show scrollbars when scrolling\" setting (Yosemite and up).\n * setting default width to 20;\n */\n return widthNoScroll - widthWithScroll || 20;\n }\n\n private refreshWrapperDimensions() {\n if (this.wrapper) {\n this._renderer.setStyle(this.wrapper, 'width', '100%');\n if (\n this._elementRef.nativeElement.style.height > 0 ||\n this._elementRef.nativeElement.offsetHeight > 0\n ) {\n this._renderer.setStyle(\n this.wrapper,\n 'height',\n this._elementRef.nativeElement.style.height ||\n this._elementRef.nativeElement.offsetHeight + 'px'\n );\n } else {\n this._renderer.setStyle(this.wrapper, 'height', '100%');\n }\n }\n }\n\n /*\n * The below solution is heavily inspired from\n * https://gist.github.com/andjosh/6764939\n */\n private scrollTo(element: Element, to: number, duration: number) {\n this.isAnimating = true;\n const rtlFactor = this.rtl ? -1 : 1;\n const start = element.scrollLeft,\n change = rtlFactor * to - start - this.snapOffset(),\n increment = 20;\n let currentTime = 0;\n\n // t = current time\n // b = start value\n // c = change in value\n // d = duration\n const easeInOutQuad = function (\n t: number,\n b: number,\n c: number,\n d: number\n ) {\n t /= d / 2;\n if (t < 1) {\n return (c / 2) * t * t + b;\n }\n t--;\n return (-c / 2) * (t * (t - 2) - 1) + b;\n };\n\n const animateScroll = () => {\n currentTime += increment;\n element.scrollLeft = easeInOutQuad(currentTime, start, change, duration);\n if (currentTime < duration) {\n this.scrollToTimer = setTimeout(animateScroll, increment);\n } else {\n // run one more frame to make sure the animation is fully finished\n setTimeout(() => {\n this.isAnimating = false;\n this.snapAnimationFinished.emit(this.currIndex);\n }, increment);\n }\n };\n animateScroll();\n }\n\n private locateCurrentIndex(snap?: boolean) {\n const scrollLeft = Math.abs(this._contentRef.nativeElement.scrollLeft);\n\n this.currentChildWidth(\n (\n currentChildWidth,\n nextChildrenWidth,\n childrenWidth,\n idx: number,\n stop\n ) => {\n if (scrollLeft >= childrenWidth && scrollLeft <= nextChildrenWidth) {\n if (\n nextChildrenWidth - scrollLeft > currentChildWidth / 2 &&\n !this.isScrollReachesRightEnd()\n ) {\n // roll back scrolling\n if (!this.isAnimating) {\n this.currIndex = idx;\n }\n if (snap) {\n this.scrollTo(\n this._contentRef.nativeElement,\n childrenWidth,\n this.snapDuration()\n );\n }\n } else if (scrollLeft !== 0) {\n // forward scrolling\n if (!this.isAnimating) {\n this.currIndex = idx + 1;\n }\n if (snap) {\n this.scrollTo(\n this._contentRef.nativeElement,\n childrenWidth + currentChildWidth,\n this.snapDuration()\n );\n }\n }\n stop();\n } else if (idx + 1 === this._children.length - 1) {\n // reaches last index\n if (!this.isAnimating) {\n this.currIndex = idx + 1;\n }\n stop();\n }\n }\n );\n }\n\n private currentChildWidth(\n cb: (\n currentClildWidth: number,\n nextChildrenWidth: number,\n childrenWidth: number,\n index: number,\n breakFunc: () => void\n ) => void\n ) {\n let childrenWidth = 0;\n let shouldBreak = false;\n const breakFunc = function () {\n shouldBreak = true;\n };\n const childrenArr = this._children.toArray();\n\n for (let i = 0; i < childrenArr.length; i++) {\n if (i === childrenArr.length - 1) {\n break;\n }\n if (shouldBreak) {\n break;\n }\n\n const nextChildrenWidth =\n childrenWidth + childrenArr[i + 1].elementRef.nativeElement.clientWidth;\n const currentClildWidth =\n childrenArr[i].elementRef.nativeElement.clientWidth;\n cb(currentClildWidth, nextChildrenWidth, childrenWidth, i, breakFunc);\n\n childrenWidth += currentClildWidth;\n }\n }\n\n private toChildrenLocation(): number {\n let to = 0;\n const childrenArr = this._children.toArray();\n for (let i = 0; i < this.currIndex; i++) {\n to += childrenArr[i].elementRef.nativeElement.clientWidth;\n }\n return to;\n }\n\n private locateDragScrollItem(\n element: Element\n ): DragScrollItemDirective | null {\n let item: DragScrollItemDirective | null = null;\n const childrenArr = this._children.toArray();\n for (let i = 0; i < childrenArr.length; i++) {\n if (element === childrenArr[i].elementRef.nativeElement) {\n item = childrenArr[i];\n }\n }\n return item;\n }\n\n private markElDimension() {\n if (this.wrapper) {\n this.elWidth = this.wrapper.style.width;\n this.elHeight = this.wrapper.style.height;\n } else {\n this.elWidth =\n this._elementRef.nativeElement.style.width ||\n this._elementRef.nativeElement.offsetWidth + 'px';\n this.elHeight =\n this._elementRef.nativeElement.style.height ||\n this._elementRef.nativeElement.offsetHeight + 'px';\n }\n const container = this.wrapper || this.parentNode;\n const containerWidth = container ? container.clientWidth : 0;\n if (this._children.length > 1) {\n this.indexBound = this.maximumIndex(\n containerWidth,\n this._children.toArray()\n );\n }\n }\n\n private maximumIndex(\n containerWidth: number,\n childrenElements: DragScrollItemDirective[]\n ): number {\n let count = 0;\n let childrenWidth = 0;\n for (let i = 0; i <= childrenElements.length; i++) {\n // last N element\n const dragScrollItemDirective: DragScrollItemDirective =\n childrenElements[childrenElements.length - 1 - i];\n if (!dragScrollItemDirective) {\n break;\n } else {\n const nativeElement = dragScrollItemDirective.elementRef.nativeElement;\n let itemWidth = nativeElement.clientWidth;\n if (itemWidth === 0 && nativeElement.firstElementChild) {\n itemWidth =\n dragScrollItemDirective.elementRef.nativeElement.firstElementChild\n .clientWidth;\n }\n childrenWidth += itemWidth;\n if (childrenWidth < containerWidth) {\n count++;\n } else {\n break;\n }\n }\n }\n return childrenElements.length - count;\n }\n\n private isScrollReachesRightEnd(): boolean {\n const scrollLeftPos =\n Math.abs(this._contentRef.nativeElement.scrollLeft) +\n this._contentRef.nativeElement.offsetWidth;\n return scrollLeftPos >= this._contentRef.nativeElement.scrollWidth;\n }\n\n /**\n * adds a margin right style to the last child element which will resolve the issue\n * of last item gets cutoff.\n */\n private adjustMarginToLastChild(): void {\n if (this._children && this._children.length > 0 && this.hideScrollbar) {\n const childrenArr = this._children.toArray();\n const lastItem =\n childrenArr[childrenArr.length - 1].elementRef.nativeElement;\n if (this.wrapper && childrenArr.length > 1) {\n this._renderer.setStyle(lastItem, 'margin-right', this.scrollbarWidth);\n } else {\n this._renderer.setStyle(lastItem, 'margin-right', 0);\n }\n }\n }\n}\n","/*\n * Public API Surface of ngx-drag-scroll\n */\n\nexport * from './lib/ngx-drag-scroll.component';\nexport * from './lib/ngx-drag-scroll-item';\nexport * from './lib/interface/drag-scroll-element';\nexport * from './lib/interface/drag-scroll-option';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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