UNPKG

@ng-bootstrap/ng-bootstrap

Version:
1 lines 57.7 kB
{"version":3,"file":"_ngb-ngbootstrap-utilities.mjs","sources":["../../../src/utils/rtl.ts","../../../src/utils/positioning.ts","../../../src/utils/util.ts","../../../src/utils/transition/util.ts","../../../src/utils/transition/ngbTransition.ts","../../../src/utils/transition/ngbCollapseTransition.ts","../../../src/utils/autoclose.ts","../../../src/utils/focus-trap.ts","../../../src/utils/positioning-util.ts","../../../src/utils/popup.ts","../../../src/utils/scrollbar.ts","../../../src/utils/triggers.ts","../../../src/utils/accessibility/live.ts","../../../src/utils/_ngb-ngbootstrap-utilities.ts"],"sourcesContent":["import { inject, Injectable, DOCUMENT } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class NgbRTL {\n\tprivate _element = inject(DOCUMENT).documentElement;\n\n\tisRTL() {\n\t\treturn (this._element.getAttribute('dir') || '').toLowerCase() === 'rtl';\n\t}\n}\n","import {\n\tarrow,\n\tcreatePopperLite,\n\tflip,\n\tInstance,\n\tModifier,\n\tPlacement as PopperPlacement,\n\tpreventOverflow,\n\tOptions,\n} from '@popperjs/core';\nimport { NgbRTL } from './rtl';\nimport { inject } from '@angular/core';\n\nconst placementSeparator = /\\s+/;\nconst spacesRegExp = / +/gi;\n\n/**\n * Matching classes from the Bootstrap ones to the poppers ones.\n * The first index of each array is used for the left to right direction,\n * the second one is used for the right to left, defaulting to the first index (when LTR and RTL lead to the same class)\n *\n * See [Bootstrap alignments](https://getbootstrap.com/docs/5.3/components/dropdowns/#alignment-options)\n * and [Popper placements](https://popper.js.org/docs/v2/constructors/#options)\n */\nconst bootstrapPopperMatches = {\n\ttop: ['top'],\n\tbottom: ['bottom'],\n\tstart: ['left', 'right'],\n\tleft: ['left'],\n\tend: ['right', 'left'],\n\tright: ['right'],\n\t'top-start': ['top-start', 'top-end'],\n\t'top-left': ['top-start'],\n\t'top-end': ['top-end', 'top-start'],\n\t'top-right': ['top-end'],\n\t'bottom-start': ['bottom-start', 'bottom-end'],\n\t'bottom-left': ['bottom-start'],\n\t'bottom-end': ['bottom-end', 'bottom-start'],\n\t'bottom-right': ['bottom-end'],\n\t'start-top': ['left-start', 'right-start'],\n\t'left-top': ['left-start'],\n\t'start-bottom': ['left-end', 'right-end'],\n\t'left-bottom': ['left-end'],\n\t'end-top': ['right-start', 'left-start'],\n\t'right-top': ['right-start'],\n\t'end-bottom': ['right-end', 'left-end'],\n\t'right-bottom': ['right-end'],\n};\n\nexport function getPopperClassPlacement(placement: Placement, isRTL: boolean): PopperPlacement {\n\tconst [leftClass, rightClass] = bootstrapPopperMatches[placement];\n\treturn isRTL ? rightClass || leftClass : leftClass;\n}\n\nconst popperStartPrimaryPlacement = /^left/;\nconst popperEndPrimaryPlacement = /^right/;\nconst popperStartSecondaryPlacement = /^start/;\nconst popperEndSecondaryPlacement = /^end/;\nexport function getBootstrapBaseClassPlacement(baseClass: string, placement: PopperPlacement): string {\n\tlet [primary, secondary] = placement.split('-');\n\tconst newPrimary = primary.replace(popperStartPrimaryPlacement, 'start').replace(popperEndPrimaryPlacement, 'end');\n\tlet classnames = [newPrimary];\n\tif (secondary) {\n\t\tlet newSecondary = secondary;\n\t\tif (primary === 'left' || primary === 'right') {\n\t\t\tnewSecondary = newSecondary\n\t\t\t\t.replace(popperStartSecondaryPlacement, 'top')\n\t\t\t\t.replace(popperEndSecondaryPlacement, 'bottom');\n\t\t}\n\t\tclassnames.push(`${newPrimary}-${newSecondary}` as Placement);\n\t}\n\tif (baseClass) {\n\t\tclassnames = classnames.map((classname) => `${baseClass}-${classname}`);\n\t}\n\treturn classnames.join(' ');\n}\n\n/*\n * Accept the placement array and applies the appropriate placement dependent on the viewport.\n * Returns the applied placement.\n * In case of auto placement, placements are selected in order\n * 'top', 'bottom', 'start', 'end',\n * 'top-start', 'top-end',\n * 'bottom-start', 'bottom-end',\n * 'start-top', 'start-bottom',\n * 'end-top', 'end-bottom'.\n * */\nexport function getPopperOptions({ placement, baseClass }: PositioningOptions, rtl: NgbRTL): Partial<Options> {\n\tlet placementVals: Array<Placement> = Array.isArray(placement)\n\t\t? placement\n\t\t: (placement.split(placementSeparator) as Array<Placement>);\n\n\t// No need to consider left and right here, as start and end are enough, and it is used for 'auto' placement only\n\tconst allowedPlacements = [\n\t\t'top',\n\t\t'bottom',\n\t\t'start',\n\t\t'end',\n\t\t'top-start',\n\t\t'top-end',\n\t\t'bottom-start',\n\t\t'bottom-end',\n\t\t'start-top',\n\t\t'start-bottom',\n\t\t'end-top',\n\t\t'end-bottom',\n\t];\n\n\t// replace auto placement with other placements\n\tlet hasAuto = placementVals.findIndex((val) => val === 'auto');\n\tif (hasAuto >= 0) {\n\t\tallowedPlacements.forEach(function (obj) {\n\t\t\tif (placementVals.find((val) => val.search('^' + obj) !== -1) == null) {\n\t\t\t\tplacementVals.splice(hasAuto++, 1, obj as Placement);\n\t\t\t}\n\t\t});\n\t}\n\n\tconst popperPlacements = placementVals.map((_placement) => {\n\t\treturn getPopperClassPlacement(_placement, rtl.isRTL());\n\t});\n\n\tlet mainPlacement = popperPlacements.shift();\n\n\tconst bsModifier: Partial<Modifier<any, any>> = {\n\t\tname: 'bootstrapClasses',\n\t\tenabled: !!baseClass,\n\t\tphase: 'write',\n\t\tfn({ state }) {\n\t\t\tconst bsClassRegExp = new RegExp(baseClass + '(-[a-z]+)*', 'gi');\n\n\t\t\tconst popperElement: HTMLElement = state.elements.popper as HTMLElement;\n\t\t\tconst popperPlacement = state.placement;\n\n\t\t\tlet className = popperElement.className;\n\n\t\t\t// Remove old bootstrap classes\n\t\t\tclassName = className.replace(bsClassRegExp, '');\n\n\t\t\t// Add current placements\n\t\t\tclassName += ` ${getBootstrapBaseClassPlacement(baseClass!, popperPlacement)}`;\n\n\t\t\t// Remove multiple spaces\n\t\t\tclassName = className.trim().replace(spacesRegExp, ' ');\n\n\t\t\t// Reassign\n\t\t\tpopperElement.className = className;\n\t\t},\n\t};\n\n\treturn {\n\t\tplacement: mainPlacement,\n\t\tmodifiers: [\n\t\t\tbsModifier,\n\t\t\tflip,\n\t\t\tpreventOverflow,\n\t\t\tarrow,\n\t\t\t{\n\t\t\t\tenabled: true,\n\t\t\t\tname: 'flip',\n\t\t\t\toptions: {\n\t\t\t\t\tfallbackPlacements: popperPlacements,\n\t\t\t\t},\n\t\t\t},\n\t\t],\n\t};\n}\n\nexport type Placement =\n\t| 'auto'\n\t| 'top'\n\t| 'bottom'\n\t| 'start'\n\t| 'left'\n\t| 'end'\n\t| 'right'\n\t| 'top-start'\n\t| 'top-left'\n\t| 'top-end'\n\t| 'top-right'\n\t| 'bottom-start'\n\t| 'bottom-left'\n\t| 'bottom-end'\n\t| 'bottom-right'\n\t| 'start-top'\n\t| 'left-top'\n\t| 'start-bottom'\n\t| 'left-bottom'\n\t| 'end-top'\n\t| 'right-top'\n\t| 'end-bottom'\n\t| 'right-bottom';\n\nexport type PlacementArray = Placement | Array<Placement> | string;\n\ninterface PositioningOptions {\n\thostElement: HTMLElement;\n\ttargetElement: HTMLElement;\n\tplacement: string | Placement | PlacementArray;\n\tbaseClass?: string;\n\tupdatePopperOptions?: (options: Partial<Options>) => Partial<Options>;\n}\n\nfunction noop(arg) {\n\treturn arg;\n}\n\nexport function ngbPositioning() {\n\tconst rtl = inject(NgbRTL);\n\tlet popperInstance: Instance | null = null;\n\n\treturn {\n\t\tcreatePopper(positioningOption: PositioningOptions) {\n\t\t\tif (!popperInstance) {\n\t\t\t\tconst updatePopperOptions = positioningOption.updatePopperOptions || noop;\n\t\t\t\tlet popperOptions = updatePopperOptions(getPopperOptions(positioningOption, rtl));\n\t\t\t\tpopperInstance = createPopperLite(\n\t\t\t\t\tpositioningOption.hostElement,\n\t\t\t\t\tpositioningOption.targetElement,\n\t\t\t\t\tpopperOptions,\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\tupdate() {\n\t\t\tif (popperInstance) {\n\t\t\t\tpopperInstance.update();\n\t\t\t}\n\t\t},\n\t\tsetOptions(positioningOption: PositioningOptions) {\n\t\t\tif (popperInstance) {\n\t\t\t\tconst updatePopperOptions = positioningOption.updatePopperOptions || noop;\n\t\t\t\tlet popperOptions = updatePopperOptions(getPopperOptions(positioningOption, rtl));\n\t\t\t\tpopperInstance.setOptions(popperOptions);\n\t\t\t}\n\t\t},\n\t\tdestroy() {\n\t\t\tif (popperInstance) {\n\t\t\t\tpopperInstance.destroy();\n\t\t\t\tpopperInstance = null;\n\t\t\t}\n\t\t},\n\t};\n}\n","import { NgZone } from '@angular/core';\nimport { Observable, OperatorFunction } from 'rxjs';\n\nexport function toInteger(value: any): number {\n\treturn parseInt(`${value}`, 10);\n}\n\nexport function toString(value: any): string {\n\treturn value !== undefined && value !== null ? `${value}` : '';\n}\n\nexport function getValueInRange(value: number, max: number, min = 0): number {\n\treturn Math.max(Math.min(value, max), min);\n}\n\nexport function isString(value: any): value is string {\n\treturn typeof value === 'string';\n}\n\nexport function isNumber(value: any): value is number {\n\treturn !isNaN(toInteger(value));\n}\n\nexport function isInteger(value: any): value is number {\n\treturn typeof value === 'number' && isFinite(value) && Math.floor(value) === value;\n}\n\nexport function isDefined(value: any): boolean {\n\treturn value !== undefined && value !== null;\n}\n\nexport function isPromise<T>(v: any): v is Promise<T> {\n\treturn v && v.then;\n}\n\nexport function padNumber(value: number) {\n\tif (isNumber(value)) {\n\t\treturn `0${value}`.slice(-2);\n\t} else {\n\t\treturn '';\n\t}\n}\n\nexport function regExpEscape(text) {\n\treturn text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&');\n}\n\nexport function closest(element: HTMLElement, selector?: string): HTMLElement | null {\n\tif (!selector) {\n\t\treturn null;\n\t}\n\n\t/*\n\t * In certain browsers (e.g. Edge 44.18362.449.0) HTMLDocument does\n\t * not support `Element.prototype.closest`. To emulate the correct behaviour\n\t * we return null when the method is missing.\n\t *\n\t * Note that in evergreen browsers `closest(document.documentElement, 'html')`\n\t * will return the document element whilst in Edge null will be returned. This\n\t * compromise was deemed good enough.\n\t */\n\tif (typeof element.closest === 'undefined') {\n\t\treturn null;\n\t}\n\n\treturn element.closest(selector);\n}\n\n/**\n * Force a browser reflow\n * @param element element where to apply the reflow\n */\nexport function reflow(element: HTMLElement) {\n\treturn (element || document.body).getBoundingClientRect();\n}\n\n/**\n * Creates an observable where all callbacks are executed inside a given zone\n *\n * @param zone\n */\nexport function runInZone<T>(zone: NgZone): OperatorFunction<T, T> {\n\treturn (source) => {\n\t\treturn new Observable((observer) => {\n\t\t\tconst next = (value: T) => zone.run(() => observer.next(value));\n\t\t\tconst error = (e: any) => zone.run(() => observer.error(e));\n\t\t\tconst complete = () => zone.run(() => observer.complete());\n\t\t\treturn source.subscribe({ next, error, complete });\n\t\t});\n\t};\n}\n\nexport function removeAccents(str: string): string {\n\treturn str.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n}\n\n/**\n * Returns the active element in the given root.\n * If the active element is inside a shadow root, it is searched recursively.\n */\nexport function getActiveElement(root: Document | ShadowRoot = document): Element | null {\n\tconst activeEl = root?.activeElement;\n\n\tif (!activeEl) {\n\t\treturn null;\n\t}\n\n\treturn activeEl.shadowRoot ? getActiveElement(activeEl.shadowRoot) : activeEl;\n}\n","export function getTransitionDurationMs(element: HTMLElement) {\n\tconst { transitionDelay, transitionDuration } = window.getComputedStyle(element);\n\tconst transitionDelaySec = parseFloat(transitionDelay);\n\tconst transitionDurationSec = parseFloat(transitionDuration);\n\n\treturn (transitionDelaySec + transitionDurationSec) * 1000;\n}\n","import { NgZone } from '@angular/core';\nimport { EMPTY, fromEvent, Observable, of, race, Subject, timer } from 'rxjs';\nimport { endWith, filter, takeUntil } from 'rxjs/operators';\nimport { getTransitionDurationMs } from './util';\nimport { runInZone } from '../util';\n\nexport type NgbTransitionStartFn<T = any> = (\n\telement: HTMLElement,\n\tanimation: boolean,\n\tcontext: T,\n) => NgbTransitionEndFn | void;\nexport type NgbTransitionEndFn = () => void;\n\nexport interface NgbTransitionOptions<T> {\n\tanimation: boolean;\n\trunningTransition: 'continue' | 'stop';\n\tcontext?: T;\n}\n\nexport interface NgbTransitionCtx<T> {\n\ttransition$: Subject<any>;\n\tcomplete: () => void;\n\tcontext: T;\n}\n\nconst noopFn: NgbTransitionEndFn = () => {};\n\nexport const environment = {\n\tgetTransitionTimerDelayMs: () => 5,\n};\n\nconst runningTransitions = new Map<HTMLElement, NgbTransitionCtx<any>>();\n\nexport const ngbRunTransition = <T>(\n\tzone: NgZone,\n\telement: HTMLElement,\n\tstartFn: NgbTransitionStartFn<T>,\n\toptions: NgbTransitionOptions<T>,\n): Observable<void> => {\n\t// Getting initial context from options\n\tlet context = options.context || <T>{};\n\n\t// Checking if there are already running transitions on the given element.\n\tconst running = runningTransitions.get(element);\n\tif (running) {\n\t\tswitch (options.runningTransition) {\n\t\t\t// If there is one running and we want for it to 'continue' to run, we have to cancel the new one.\n\t\t\t// We're not emitting any values, but simply completing the observable (EMPTY).\n\t\t\tcase 'continue':\n\t\t\t\treturn EMPTY;\n\t\t\t// If there is one running and we want for it to 'stop', we have to complete the running one.\n\t\t\t// We're simply completing the running one and not emitting any values and merging newly provided context\n\t\t\t// with the one coming from currently running transition.\n\t\t\tcase 'stop':\n\t\t\t\tzone.run(() => running.transition$.complete());\n\t\t\t\tcontext = Object.assign(running.context, context);\n\t\t\t\trunningTransitions.delete(element);\n\t\t}\n\t}\n\n\t// Running the start function\n\tconst endFn = startFn(element, options.animation, context) || noopFn;\n\n\t// If 'prefer-reduced-motion' is enabled, the 'transition' will be set to 'none'.\n\t// If animations are disabled, we have to emit a value and complete the observable\n\t// In this case we have to call the end function, but can finish immediately by emitting a value,\n\t// completing the observable and executing end functions synchronously.\n\tif (!options.animation || window.getComputedStyle(element).transitionProperty === 'none') {\n\t\tzone.run(() => endFn());\n\t\treturn of(undefined).pipe(runInZone(zone));\n\t}\n\n\t// Starting a new transition\n\tconst transition$ = new Subject<void>();\n\tconst finishTransition$ = new Subject<void>();\n\tconst stop$ = transition$.pipe(endWith(true));\n\trunningTransitions.set(element, {\n\t\ttransition$,\n\t\tcomplete: () => {\n\t\t\tfinishTransition$.next();\n\t\t\tfinishTransition$.complete();\n\t\t},\n\t\tcontext,\n\t});\n\n\tconst transitionDurationMs = getTransitionDurationMs(element);\n\n\t// 1. We have to both listen for the 'transitionend' event and have a 'just-in-case' timer,\n\t// because 'transitionend' event might not be fired in some browsers, if the transitioning\n\t// element becomes invisible (ex. when scrolling, making browser tab inactive, etc.). The timer\n\t// guarantees, that we'll release the DOM element and complete 'ngbRunTransition'.\n\t// 2. We need to filter transition end events, because they might bubble from shorter transitions\n\t// on inner DOM elements. We're only interested in the transition on the 'element' itself.\n\tzone.runOutsideAngular(() => {\n\t\tconst transitionEnd$ = fromEvent(element, 'transitionend').pipe(\n\t\t\ttakeUntil(stop$),\n\t\t\tfilter(({ target }) => target === element),\n\t\t);\n\t\tconst timer$ = timer(transitionDurationMs + environment.getTransitionTimerDelayMs()).pipe(takeUntil(stop$));\n\n\t\trace(timer$, transitionEnd$, finishTransition$)\n\t\t\t.pipe(takeUntil(stop$))\n\t\t\t.subscribe(() => {\n\t\t\t\trunningTransitions.delete(element);\n\t\t\t\tzone.run(() => {\n\t\t\t\t\tendFn();\n\t\t\t\t\ttransition$.next();\n\t\t\t\t\ttransition$.complete();\n\t\t\t\t});\n\t\t\t});\n\t});\n\n\treturn transition$.asObservable();\n};\n\nexport const ngbCompleteTransition = (element: HTMLElement) => {\n\trunningTransitions.get(element)?.complete();\n};\n","import { NgbTransitionStartFn } from './ngbTransition';\nimport { reflow } from '../util';\n\nexport interface NgbCollapseCtx {\n\tdirection: 'show' | 'hide';\n\tdimension: 'width' | 'height';\n\tmaxSize?: string;\n}\n\nfunction measureCollapsingElementDimensionPx(element: HTMLElement, dimension: 'width' | 'height'): string {\n\t// SSR fix for without injecting the PlatformId\n\tif (typeof navigator === 'undefined') {\n\t\treturn '0px';\n\t}\n\n\tconst { classList } = element;\n\tconst hasShownClass = classList.contains('show');\n\tif (!hasShownClass) {\n\t\tclassList.add('show');\n\t}\n\n\telement.style[dimension] = '';\n\tconst dimensionSize = element.getBoundingClientRect()[dimension] + 'px';\n\n\tif (!hasShownClass) {\n\t\tclassList.remove('show');\n\t}\n\n\treturn dimensionSize;\n}\n\nexport const ngbCollapsingTransition: NgbTransitionStartFn<NgbCollapseCtx> = (\n\telement: HTMLElement,\n\tanimation: boolean,\n\tcontext: NgbCollapseCtx,\n) => {\n\tlet { direction, maxSize, dimension } = context;\n\tconst { classList } = element;\n\n\tfunction setInitialClasses() {\n\t\tclassList.add('collapse');\n\t\tif (direction === 'show') {\n\t\t\tclassList.add('show');\n\t\t} else {\n\t\t\tclassList.remove('show');\n\t\t}\n\t}\n\n\t// without animations we just need to set initial classes\n\tif (!animation) {\n\t\tsetInitialClasses();\n\t\treturn;\n\t}\n\n\t// No maxHeight -> running the transition for the first time\n\tif (!maxSize) {\n\t\tmaxSize = measureCollapsingElementDimensionPx(element, dimension);\n\t\tcontext.maxSize = maxSize;\n\n\t\t// Fix the height before starting the animation\n\t\telement.style[dimension] = direction !== 'show' ? maxSize : '0px';\n\n\t\tclassList.remove('collapse', 'collapsing', 'show');\n\n\t\treflow(element);\n\n\t\t// Start the animation\n\t\tclassList.add('collapsing');\n\t}\n\n\t// Start or revert the animation\n\telement.style[dimension] = direction === 'show' ? maxSize : '0px';\n\n\treturn () => {\n\t\tsetInitialClasses();\n\t\tclassList.remove('collapsing');\n\t\telement.style[dimension] = '';\n\t};\n};\n","import { NgZone } from '@angular/core';\nimport { fromEvent, Observable, race } from 'rxjs';\nimport { delay, filter, map, takeUntil, tap, withLatestFrom } from 'rxjs/operators';\nimport { closest } from './util';\n\nconst isContainedIn = (element: HTMLElement, array?: HTMLElement[]) =>\n\tarray ? array.some((item) => item.contains(element)) : false;\n\nconst matchesSelectorIfAny = (element: HTMLElement, selector?: string) =>\n\t!selector || closest(element, selector) != null;\n\n// we have to add a more significant delay to avoid re-opening when handling (click) on a toggling element\n// TODO: use proper Angular platform detection when NgbAutoClose becomes a service and we can inject PLATFORM_ID\nconst isMobile = (() => {\n\tconst isIOS = () =>\n\t\t/iPad|iPhone|iPod/.test(navigator.userAgent) ||\n\t\t(/Macintosh/.test(navigator.userAgent) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2);\n\tconst isAndroid = () => /Android/.test(navigator.userAgent);\n\n\treturn typeof navigator !== 'undefined' ? !!navigator.userAgent && (isIOS() || isAndroid()) : false;\n})();\n\n// setting 'ngbAutoClose' synchronously on mobile results in immediate popup closing\n// when tapping on the triggering element\nconst wrapAsyncForMobile = (fn) => (isMobile ? () => setTimeout(() => fn(), 100) : fn);\n\nexport const enum SOURCE {\n\tESCAPE,\n\tCLICK,\n}\n\nexport function ngbAutoClose(\n\tzone: NgZone,\n\tdocument: any,\n\ttype: boolean | 'inside' | 'outside',\n\tclose: (source: SOURCE) => void,\n\tclosed$: Observable<any>,\n\tinsideElements: HTMLElement[],\n\tignoreElements?: HTMLElement[],\n\tinsideSelector?: string,\n) {\n\t// closing on ESC and outside clicks\n\tif (type) {\n\t\tzone.runOutsideAngular(\n\t\t\twrapAsyncForMobile(() => {\n\t\t\t\tconst shouldCloseOnClick = (event: MouseEvent) => {\n\t\t\t\t\tconst element = event.target as HTMLElement;\n\t\t\t\t\tif (event.button === 2 || isContainedIn(element, ignoreElements)) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tif (type === 'inside') {\n\t\t\t\t\t\treturn isContainedIn(element, insideElements) && matchesSelectorIfAny(element, insideSelector);\n\t\t\t\t\t} else if (type === 'outside') {\n\t\t\t\t\t\treturn !isContainedIn(element, insideElements);\n\t\t\t\t\t} /* if (type === true) */ else {\n\t\t\t\t\t\treturn matchesSelectorIfAny(element, insideSelector) || !isContainedIn(element, insideElements);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tconst escapes$ = fromEvent<KeyboardEvent>(document, 'keydown').pipe(\n\t\t\t\t\ttakeUntil(closed$),\n\t\t\t\t\tfilter((e) => e.key === 'Escape'),\n\t\t\t\t\ttap((e) => e.preventDefault()),\n\t\t\t\t);\n\n\t\t\t\t// we have to pre-calculate 'shouldCloseOnClick' on 'mousedown',\n\t\t\t\t// because on 'mouseup' DOM nodes might be detached\n\t\t\t\tconst mouseDowns$ = fromEvent<MouseEvent>(document, 'mousedown').pipe(\n\t\t\t\t\tmap(shouldCloseOnClick),\n\t\t\t\t\ttakeUntil(closed$),\n\t\t\t\t);\n\n\t\t\t\tconst closeableClicks$ = fromEvent<MouseEvent>(document, 'mouseup').pipe(\n\t\t\t\t\twithLatestFrom(mouseDowns$),\n\t\t\t\t\tfilter(([_, shouldClose]) => shouldClose),\n\t\t\t\t\tdelay(0),\n\t\t\t\t\ttakeUntil(closed$),\n\t\t\t\t) as Observable<MouseEvent>;\n\n\t\t\t\trace([escapes$.pipe(map((_) => SOURCE.ESCAPE)), closeableClicks$.pipe(map((_) => SOURCE.CLICK))]).subscribe(\n\t\t\t\t\t(source: SOURCE) => zone.run(() => close(source)),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\t}\n}\n","import { NgZone } from '@angular/core';\n\nimport { fromEvent, Observable } from 'rxjs';\nimport { filter, map, takeUntil, withLatestFrom } from 'rxjs/operators';\n\nexport const FOCUSABLE_ELEMENTS_SELECTOR = [\n\t'a[href]',\n\t'button:not([disabled])',\n\t'input:not([disabled]):not([type=\"hidden\"])',\n\t'select:not([disabled])',\n\t'textarea:not([disabled])',\n\t'[contenteditable]',\n\t'[tabindex]:not([tabindex=\"-1\"])',\n].join(', ');\n\n/**\n * Returns first and last focusable elements inside of a given element based on specific CSS selector\n */\nexport function getFocusableBoundaryElements(element: HTMLElement): HTMLElement[] {\n\tconst list: HTMLElement[] = Array.from(\n\t\telement.querySelectorAll(FOCUSABLE_ELEMENTS_SELECTOR) as NodeListOf<HTMLElement>,\n\t).filter((el) => el.tabIndex !== -1);\n\treturn [list[0], list[list.length - 1]];\n}\n\n/**\n * Function that enforces browser focus to be trapped inside a DOM element.\n *\n * Works only for clicks inside the element and navigation with 'Tab', ignoring clicks outside of the element\n *\n * @param zone Angular zone\n * @param element The element around which focus will be trapped inside\n * @param stopFocusTrap$ The observable stream. When completed the focus trap will clean up listeners\n * and free internal resources\n * @param refocusOnClick Put the focus back to the last focused element whenever a click occurs on element (default to\n * false)\n */\nexport const ngbFocusTrap = (\n\tzone: NgZone,\n\telement: HTMLElement,\n\tstopFocusTrap$: Observable<any>,\n\trefocusOnClick = false,\n) => {\n\tzone.runOutsideAngular(() => {\n\t\t// last focused element\n\t\tconst lastFocusedElement$ = fromEvent<FocusEvent>(element, 'focusin').pipe(\n\t\t\ttakeUntil(stopFocusTrap$),\n\t\t\tmap((e) => e.target),\n\t\t);\n\n\t\t// 'tab' / 'shift+tab' stream\n\t\tfromEvent<KeyboardEvent>(element, 'keydown')\n\t\t\t.pipe(\n\t\t\t\ttakeUntil(stopFocusTrap$),\n\t\t\t\tfilter((e) => e.key === 'Tab'),\n\t\t\t\twithLatestFrom(lastFocusedElement$),\n\t\t\t)\n\t\t\t.subscribe(([tabEvent, focusedElement]) => {\n\t\t\t\tconst [first, last] = getFocusableBoundaryElements(element);\n\n\t\t\t\tif ((focusedElement === first || focusedElement === element) && tabEvent.shiftKey) {\n\t\t\t\t\tlast.focus();\n\t\t\t\t\ttabEvent.preventDefault();\n\t\t\t\t}\n\n\t\t\t\tif (focusedElement === last && !tabEvent.shiftKey) {\n\t\t\t\t\tfirst.focus();\n\t\t\t\t\ttabEvent.preventDefault();\n\t\t\t\t}\n\t\t\t});\n\n\t\t// inside click\n\t\tif (refocusOnClick) {\n\t\t\tfromEvent(element, 'click')\n\t\t\t\t.pipe(\n\t\t\t\t\ttakeUntil(stopFocusTrap$),\n\t\t\t\t\twithLatestFrom(lastFocusedElement$),\n\t\t\t\t\tmap((arr) => arr[1] as HTMLElement),\n\t\t\t\t)\n\t\t\t\t.subscribe((lastFocusedElement) => lastFocusedElement.focus());\n\t\t}\n\t});\n};\n","import { offset as offsetModifier, Options } from '@popperjs/core';\n\nexport function addPopperOffset(offset: number[]) {\n\treturn (options: Partial<Options>) => {\n\t\toptions.modifiers!.push(offsetModifier, {\n\t\t\tname: 'offset',\n\t\t\toptions: {\n\t\t\t\toffset: () => offset,\n\t\t\t},\n\t\t});\n\n\t\treturn options;\n\t};\n}\n","import {\n\tafterNextRender,\n\tApplicationRef,\n\tComponentRef,\n\tinject,\n\tInjector,\n\tNgZone,\n\tTemplateRef,\n\tType,\n\tViewContainerRef,\n\tViewRef,\n\tDOCUMENT,\n} from '@angular/core';\n\nimport { Observable, of, Subject } from 'rxjs';\nimport { mergeMap, tap } from 'rxjs/operators';\n\nimport { ngbRunTransition } from './transition/ngbTransition';\n\nexport class ContentRef {\n\tconstructor(\n\t\tpublic nodes: Node[][],\n\t\tpublic viewRef?: ViewRef,\n\t\tpublic componentRef?: ComponentRef<any>,\n\t) {}\n}\n\nexport class PopupService<T> {\n\tprivate _windowRef: ComponentRef<T> | null = null;\n\tprivate _contentRef: ContentRef | null = null;\n\n\tprivate _document = inject(DOCUMENT);\n\tprivate _applicationRef = inject(ApplicationRef);\n\tprivate _injector = inject(Injector);\n\tprivate _viewContainerRef = inject(ViewContainerRef);\n\tprivate _ngZone = inject(NgZone);\n\n\tconstructor(private _componentType: Type<T>) {}\n\n\topen(\n\t\tcontent?: string | TemplateRef<any>,\n\t\ttemplateContext?: any,\n\t\tanimation = false,\n\t): { windowRef: ComponentRef<T>; transition$: Observable<void> } {\n\t\tif (!this._windowRef) {\n\t\t\tthis._contentRef = this._getContentRef(content, templateContext);\n\t\t\tthis._windowRef = this._viewContainerRef.createComponent(this._componentType, {\n\t\t\t\tinjector: this._injector,\n\t\t\t\tprojectableNodes: this._contentRef.nodes,\n\t\t\t});\n\t\t}\n\n\t\tconst { nativeElement } = this._windowRef.location;\n\n\t\tconst nextRenderSubject = new Subject<void>();\n\t\tafterNextRender(\n\t\t\t{\n\t\t\t\tmixedReadWrite: () => {\n\t\t\t\t\tnextRenderSubject.next();\n\t\t\t\t\tnextRenderSubject.complete();\n\t\t\t\t},\n\t\t\t},\n\t\t\t{\n\t\t\t\tinjector: this._injector,\n\t\t\t},\n\t\t);\n\t\tconst transition$ = nextRenderSubject.pipe(\n\t\t\tmergeMap(() =>\n\t\t\t\tngbRunTransition(this._ngZone, nativeElement, ({ classList }) => classList.add('show'), {\n\t\t\t\t\tanimation,\n\t\t\t\t\trunningTransition: 'continue',\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\n\t\treturn { windowRef: this._windowRef, transition$ };\n\t}\n\n\tclose(animation = false): Observable<void> {\n\t\tif (!this._windowRef) {\n\t\t\treturn of(undefined);\n\t\t}\n\n\t\treturn ngbRunTransition(\n\t\t\tthis._ngZone,\n\t\t\tthis._windowRef.location.nativeElement,\n\t\t\t({ classList }) => classList.remove('show'),\n\t\t\t{ animation, runningTransition: 'stop' },\n\t\t).pipe(\n\t\t\ttap(() => {\n\t\t\t\tthis._windowRef?.destroy();\n\t\t\t\tthis._contentRef?.viewRef?.destroy();\n\t\t\t\tthis._windowRef = null;\n\t\t\t\tthis._contentRef = null;\n\t\t\t}),\n\t\t);\n\t}\n\n\tprivate _getContentRef(content?: string | TemplateRef<any>, templateContext?: any): ContentRef {\n\t\tif (!content) {\n\t\t\treturn new ContentRef([]);\n\t\t} else if (content instanceof TemplateRef) {\n\t\t\tconst viewRef = content.createEmbeddedView(templateContext);\n\t\t\tthis._applicationRef.attachView(viewRef);\n\t\t\treturn new ContentRef([viewRef.rootNodes], viewRef);\n\t\t} else {\n\t\t\treturn new ContentRef([[this._document.createTextNode(`${content}`)]]);\n\t\t}\n\t}\n}\n","import { inject, Injectable, DOCUMENT } from '@angular/core';\n\n/** Type for the callback used to revert the scrollbar. */\nexport type ScrollbarReverter = () => void;\n\n/**\n * Utility to handle the scrollbar.\n *\n * It allows to hide the scrollbar and compensate the lack of a vertical scrollbar\n * by adding an equivalent padding on the right of the body, and to revert this change.\n */\n@Injectable({ providedIn: 'root' })\nexport class ScrollBar {\n\tprivate _document = inject(DOCUMENT);\n\n\t/**\n\t * To be called to hide a potential vertical scrollbar:\n\t * - if a scrollbar is there and has a width greater than 0, adds some compensation\n\t * padding to the body to keep the same layout as when the scrollbar is there\n\t * - adds overflow: hidden\n\t *\n\t * @return a callback used to revert the change\n\t */\n\thide(): ScrollbarReverter {\n\t\tconst scrollbarWidth = Math.abs(window.innerWidth - this._document.documentElement.clientWidth);\n\t\tconst body = this._document.body;\n\t\tconst bodyStyle = body.style;\n\t\tconst { overflow, paddingRight } = bodyStyle;\n\t\tif (scrollbarWidth > 0) {\n\t\t\tconst actualPadding = parseFloat(window.getComputedStyle(body).paddingRight);\n\t\t\tbodyStyle.paddingRight = `${actualPadding + scrollbarWidth}px`;\n\t\t}\n\t\tbodyStyle.overflow = 'hidden';\n\t\treturn () => {\n\t\t\tif (scrollbarWidth > 0) {\n\t\t\t\tbodyStyle.paddingRight = paddingRight;\n\t\t\t}\n\t\t\tbodyStyle.overflow = overflow;\n\t\t};\n\t}\n}\n","import { Observable, EMPTY } from 'rxjs';\n\nconst ALIASES = {\n\thover: ['mouseenter', 'mouseleave'],\n\tfocus: ['focusin', 'focusout'],\n};\n\nexport function parseTriggers(triggers: string): [string, string?][] {\n\tconst trimmedTriggers = (triggers || '').trim();\n\n\tif (trimmedTriggers.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst parsedTriggers = trimmedTriggers\n\t\t.split(/\\s+/)\n\t\t.map((trigger) => trigger.split(':'))\n\t\t.map((triggerPair) => (ALIASES[triggerPair[0]] || triggerPair) as [string, string?]);\n\n\tconst manualTriggers = parsedTriggers.filter((triggerPair) => triggerPair.includes('manual'));\n\n\tif (manualTriggers.length > 1) {\n\t\tthrow `Triggers parse error: only one manual trigger is allowed`;\n\t}\n\n\tif (manualTriggers.length === 1 && parsedTriggers.length > 1) {\n\t\tthrow `Triggers parse error: manual trigger can't be mixed with other triggers`;\n\t}\n\n\treturn manualTriggers.length ? [] : parsedTriggers;\n}\n\nexport function listenToTriggers(\n\telement: HTMLElement,\n\ttriggers: string,\n\tisOpenedFn: () => boolean,\n\topenFn: () => void,\n\tcloseFn: () => void,\n\topenDelayMs = 0,\n\tcloseDelayMs = 0,\n\tenterContent: Observable<void> = EMPTY,\n\tleaveContent: Observable<void> = EMPTY,\n) {\n\tconst parsedTriggers = parseTriggers(triggers);\n\n\tif (parsedTriggers.length === 0) {\n\t\treturn () => {};\n\t}\n\n\tconst activeOpenTriggers = new Set<string>();\n\tconst cleanupFns: (() => void)[] = [];\n\tlet timeout: any;\n\n\tfunction addEventListener(name: string, listener: () => void) {\n\t\telement.addEventListener(name, listener);\n\t\tcleanupFns.push(() => element.removeEventListener(name, listener));\n\t}\n\n\tfunction withDelay(fn: () => void, delayMs: number) {\n\t\tclearTimeout(timeout);\n\t\tif (delayMs > 0) {\n\t\t\ttimeout = setTimeout(fn, delayMs);\n\t\t} else {\n\t\t\tfn();\n\t\t}\n\t}\n\n\tfor (const [openTrigger, closeTrigger] of parsedTriggers) {\n\t\tif (!closeTrigger) {\n\t\t\taddEventListener(openTrigger, () =>\n\t\t\t\tisOpenedFn() ? withDelay(closeFn, closeDelayMs) : withDelay(openFn, openDelayMs),\n\t\t\t);\n\t\t} else {\n\t\t\taddEventListener(openTrigger, () => {\n\t\t\t\tactiveOpenTriggers.add(openTrigger);\n\t\t\t\twithDelay(() => activeOpenTriggers.size > 0 && openFn(), openDelayMs);\n\t\t\t});\n\t\t\taddEventListener(closeTrigger, () => {\n\t\t\t\tactiveOpenTriggers.delete(openTrigger);\n\t\t\t\twithDelay(() => activeOpenTriggers.size === 0 && closeFn(), closeDelayMs);\n\t\t\t});\n\t\t}\n\t\tif (openTrigger === 'mouseenter' && closeTrigger === 'mouseleave' && closeDelayMs > 0) {\n\t\t\tconst enterContentSub = enterContent.subscribe(() => {\n\t\t\t\tactiveOpenTriggers.delete(openTrigger);\n\t\t\t\tclearTimeout(timeout);\n\t\t\t});\n\t\t\tconst leaveContentSub = leaveContent.subscribe(() => {\n\t\t\t\tactiveOpenTriggers.delete(openTrigger);\n\t\t\t\twithDelay(() => activeOpenTriggers.size === 0 && closeFn(), closeDelayMs);\n\t\t\t});\n\t\t\tcleanupFns.push(\n\t\t\t\t() => enterContentSub.unsubscribe(),\n\t\t\t\t() => leaveContentSub.unsubscribe(),\n\t\t\t);\n\t\t}\n\t}\n\n\tcleanupFns.push(() => clearTimeout(timeout));\n\treturn () => cleanupFns.forEach((cleanupFn) => cleanupFn());\n}\n","import { inject, Injectable, InjectionToken, OnDestroy, DOCUMENT } from '@angular/core';\n\nexport const ARIA_LIVE_DELAY = new InjectionToken<number | null>('live announcer delay', {\n\tprovidedIn: 'root',\n\tfactory: () => 100,\n});\n\nfunction getLiveElement(document: any, lazyCreate = false): HTMLElement | null {\n\tlet element = document.body.querySelector('#ngb-live') as HTMLElement;\n\n\tif (element == null && lazyCreate) {\n\t\telement = document.createElement('div');\n\n\t\telement.setAttribute('id', 'ngb-live');\n\t\telement.setAttribute('aria-live', 'polite');\n\t\telement.setAttribute('aria-atomic', 'true');\n\n\t\telement.classList.add('visually-hidden');\n\n\t\tdocument.body.appendChild(element);\n\t}\n\n\treturn element;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class Live implements OnDestroy {\n\tprivate _document = inject(DOCUMENT);\n\tprivate _delay = inject(ARIA_LIVE_DELAY);\n\n\tngOnDestroy() {\n\t\tconst element = getLiveElement(this._document);\n\t\tif (element) {\n\t\t\t// if exists, it will always be attached to the <body>\n\t\t\telement.parentElement!.removeChild(element);\n\t\t}\n\t}\n\n\tsay(message: string) {\n\t\tconst element = getLiveElement(this._document, true);\n\t\tconst delay = this._delay;\n\n\t\tif (element != null) {\n\t\t\telement.textContent = '';\n\t\t\tconst setText = () => (element.textContent = message);\n\t\t\tif (delay === null) {\n\t\t\t\tsetText();\n\t\t\t} else {\n\t\t\t\tsetTimeout(setText, delay);\n\t\t\t}\n\t\t}\n\t}\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["offset","offsetModifier"],"mappings":"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