import { AXComponent, MXBaseComponent } from '@acorex/cdk/common';
import * as i0 from '@angular/core';
import { HostBinding, Input, ViewEncapsulation, Component, InjectionToken, inject, EventEmitter, Output, ChangeDetectionStrategy, Injectable, ElementRef, Directive, NgModule } from '@angular/core';
import { ComponentPortal, CdkPortalOutlet } from '@angular/cdk/portal';
import { Dialog } from '@angular/cdk/dialog';
import { asyncScheduler, BehaviorSubject } from 'rxjs';
import { observeOn, finalize } from 'rxjs/operators';

/**
 * A loading spinner component that displays a rotating spinner icon.
 * @category Components
 */
class AXLoadingSpinnerComponent {
    constructor() {
        /**
         * Color of the spinner. Can be a predefined style color or a custom color.
         * @defaultValue 'default'
         */
        this.color = 'default';
        /**
         * Size of the spinner, in pixels. This determines both the width and height of the spinner.
         * @defaultValue 16
         */
        this.size = 16;
        /**
         * Thickness of the spinner's border, in pixels. This affects the visual weight of the spinner's outline.
         * @defaultValue 3
         */
        this.stroke = 3;
    }
    /**
     *  @ignore
     */
    get __hostClass() {
        return `ax-${this.color}`;
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingSpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: AXLoadingSpinnerComponent, isStandalone: true, selector: "ax-loading-spinner", inputs: { text: "text", color: "color", size: "size", stroke: "stroke" }, host: { properties: { "class": "this.__hostClass" } }, providers: [{ provide: AXComponent, useExisting: AXLoadingSpinnerComponent }], ngImport: i0, template: `
    <span
      class="ax-loader"
      [style.width.px]="size"
      [style.height.px]="size"
      [style.border-width.px]="stroke"
      [style.border-color]="color"
    ></span>
    @if (text) {
      <span> {{ text }} </span>
    }
  `, isInline: true, styles: ["ax-loading-spinner{--ax-comp-loading-spinner-loader-height: 3rem;--ax-comp-loading-spinner-loader-width: 3rem;--ax-comp-loading-spinner-loader-border-width: 6px}ax-loading-spinner.ax-black{--ax-comp-loading-spinner-loader-border-color: 0, 0, 0}ax-loading-spinner.ax-white{--ax-comp-loading-spinner-loader-border-color: 255, 255, 255}ax-loading-spinner.ax-primary{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-primary-surface)}ax-loading-spinner.ax-secondary{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-secondary-surface)}ax-loading-spinner.ax-success{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-success-surface)}ax-loading-spinner.ax-warning{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-warning-surface)}ax-loading-spinner.ax-danger{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-danger-surface)}ax-loading-spinner.ax-accent1{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent1-surface)}ax-loading-spinner.ax-accent2{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent2-surface)}ax-loading-spinner.ax-accent3{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent3-surface)}ax-loading-spinner.ax-accent4{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent4-surface)}ax-loading-spinner.ax-accent5{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent5-surface)}ax-loading-spinner.ax-accent6{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent6-surface)}ax-loading-spinner.ax-accent7{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent7-surface)}ax-loading-spinner .ax-loader{margin:auto;border-style:solid;display:inline-block;border-radius:9999px;box-sizing:border-box;animation:rotation .5s linear infinite;border-bottom-color:transparent!important;width:var(--ax-comp-loading-spinner-loader-width);height:var(--ax-comp-loading-spinner-loader-height);border-width:var(--ax-comp-loading-spinner-loader-border-width);border-color:rgba(var(--ax-comp-loading-spinner-loader-border-color))}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingSpinnerComponent, decorators: [{
            type: Component,
            args: [{ selector: 'ax-loading-spinner', template: `
    <span
      class="ax-loader"
      [style.width.px]="size"
      [style.height.px]="size"
      [style.border-width.px]="stroke"
      [style.border-color]="color"
    ></span>
    @if (text) {
      <span> {{ text }} </span>
    }
  `, encapsulation: ViewEncapsulation.None, providers: [{ provide: AXComponent, useExisting: AXLoadingSpinnerComponent }], styles: ["ax-loading-spinner{--ax-comp-loading-spinner-loader-height: 3rem;--ax-comp-loading-spinner-loader-width: 3rem;--ax-comp-loading-spinner-loader-border-width: 6px}ax-loading-spinner.ax-black{--ax-comp-loading-spinner-loader-border-color: 0, 0, 0}ax-loading-spinner.ax-white{--ax-comp-loading-spinner-loader-border-color: 255, 255, 255}ax-loading-spinner.ax-primary{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-primary-surface)}ax-loading-spinner.ax-secondary{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-secondary-surface)}ax-loading-spinner.ax-success{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-success-surface)}ax-loading-spinner.ax-warning{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-warning-surface)}ax-loading-spinner.ax-danger{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-danger-surface)}ax-loading-spinner.ax-accent1{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent1-surface)}ax-loading-spinner.ax-accent2{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent2-surface)}ax-loading-spinner.ax-accent3{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent3-surface)}ax-loading-spinner.ax-accent4{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent4-surface)}ax-loading-spinner.ax-accent5{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent5-surface)}ax-loading-spinner.ax-accent6{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent6-surface)}ax-loading-spinner.ax-accent7{--ax-comp-loading-spinner-loader-border-color: var(--ax-sys-color-accent7-surface)}ax-loading-spinner .ax-loader{margin:auto;border-style:solid;display:inline-block;border-radius:9999px;box-sizing:border-box;animation:rotation .5s linear infinite;border-bottom-color:transparent!important;width:var(--ax-comp-loading-spinner-loader-width);height:var(--ax-comp-loading-spinner-loader-height);border-width:var(--ax-comp-loading-spinner-loader-border-width);border-color:rgba(var(--ax-comp-loading-spinner-loader-border-color))}@keyframes rotation{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
        }], propDecorators: { text: [{
                type: Input
            }], color: [{
                type: Input
            }], size: [{
                type: Input
            }], stroke: [{
                type: Input
            }], __hostClass: [{
                type: HostBinding,
                args: ['class']
            }] } });

const AX_LOADING_CONFIG = new InjectionToken('AX_LOADING_CONFIG', {
    providedIn: 'root',
    factory: () => AXLoadingDefaultConfig,
});
const AXLoadingDefaultConfig = {
    spinner: AXLoadingSpinnerComponent,
};
function loadingConfig(config = {}) {
    const result = {
        ...AXLoadingDefaultConfig,
        ...config,
    };
    return result;
}

/**
 * A component that displays a loading indicator.
 * @category Components
 */
class AXLoadingComponent extends MXBaseComponent {
    constructor() {
        super(...arguments);
        this.config = inject(AX_LOADING_CONFIG);
        /**
         * Emits an event when the visibility state of the component changes.
         * @event
         */
        this.visibleChange = new EventEmitter();
        /**
         * Specifies the type of loading indicator to display.
         * @defaultValue 'spinner'
         */
        this.type = 'spinner';
    }
    /**
     * Determines whether the component is visible or not.
     */
    get visible() {
        return this._visible;
    }
    /**
     * Sets the visibility of the component and emits a visibility change event.
     *
     * @param v - A boolean value indicating whether the component should be visible.
     */
    set visible(v) {
        if (v != this._visible) {
            this._visible = v;
            v ? this.getHostElement().classList.remove('ax-hide') : this.getHostElement().classList.add('ax-hide');
            this.visibleChange.emit(v);
        }
    }
    /**
     *  @ignore
     */
    ngOnInit() {
        super.ngOnInit();
        this._selectedPortal = new ComponentPortal(this.config.spinner);
        this.cdr.markForCheck();
    }
    /**
     *  @ignore
     */
    _handleAttched(ref) {
        ref = ref;
        if (ref.instance && this.context) {
            Object.assign(ref.instance, this.context);
        }
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: AXLoadingComponent, isStandalone: true, selector: "ax-loading", inputs: { visible: "visible", type: "type", context: "context" }, outputs: { visibleChange: "visibleChange" }, providers: [{ provide: AXComponent, useExisting: AXLoadingComponent }], usesInheritance: true, ngImport: i0, template: ` <ng-template [cdkPortalOutlet]="_selectedPortal" (attached)="_handleAttched($event)"></ng-template> `, isInline: true, styles: ["ax-loading{--ax-comp-loading-padding-x: .25rem;--ax-comp-loading-inner-scale: 0;--ax-comp-loading-pulse-scale: 1.05;--ax-comp-loading-animation-duration: 2s;--ax-comp-loading-spinner-gap: .75rem}.ax-loading-overlay-backdrop{--ax-comp-loading-overlay-opacity: .6}.ax-loading-pane{--ax-comp-loading-pane-outline-width: 2px;--ax-comp-loading-pane-outline-offset: 2px}ax-loading{position:relative;padding-left:var(--ax-comp-loading-padding-x);padding-right:var(--ax-comp-loading-padding-x)}ax-loading:before,ax-loading:after{content:\"\";top:50%;width:100%;height:100%;position:absolute;border-radius:9999px;inset-inline-start:50%;transform:translate(-50%,-50%) scale(var(--ax-comp-loading-inner-scale));background-color:transparent;animation:var(--ax-comp-loading-animation-duration) ease-in-out both ax-pulse;animation-iteration-count:infinite}@keyframes ax-pulse{50%{transform:scale3d(var(--ax-comp-loading-pulse-scale),var(--ax-comp-loading-pulse-scale),var(--ax-comp-loading-pulse-scale))}}ax-loading ax-loading-spinner{display:flex;gap:var(--ax-comp-loading-spinner-gap)}.ax-loading-overlay-backdrop{opacity:var(--ax-comp-loading-overlay-opacity);background-color:rgba(var(--ax-comp-loading-overlay-bg-color, var(--ax-sys-color-surface)))}.ax-loading-pane{top:0;bottom:0;inset-inline-end:0px;inset-inline-start:0px;width:100%!important;height:100%!important}.ax-loading-pane .cdk-dialog-container{display:flex!important;align-items:center;justify-content:center}.ax-loading-pane .cdk-dialog-container:focus,.ax-loading-pane .cdk-dialog-container:focus-visible,.ax-loading-pane .cdk-dialog-container:focus-within{outline-style:solid;outline-color:transparent;outline-width:var(--ax-comp-loading-pane-outline-width);outline-offset:var(--ax-comp-loading-pane-outline-offset)}\n"], dependencies: [{ kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingComponent, decorators: [{
            type: Component,
            args: [{ selector: 'ax-loading', template: ` <ng-template [cdkPortalOutlet]="_selectedPortal" (attached)="_handleAttched($event)"></ng-template> `, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [CdkPortalOutlet], providers: [{ provide: AXComponent, useExisting: AXLoadingComponent }], styles: ["ax-loading{--ax-comp-loading-padding-x: .25rem;--ax-comp-loading-inner-scale: 0;--ax-comp-loading-pulse-scale: 1.05;--ax-comp-loading-animation-duration: 2s;--ax-comp-loading-spinner-gap: .75rem}.ax-loading-overlay-backdrop{--ax-comp-loading-overlay-opacity: .6}.ax-loading-pane{--ax-comp-loading-pane-outline-width: 2px;--ax-comp-loading-pane-outline-offset: 2px}ax-loading{position:relative;padding-left:var(--ax-comp-loading-padding-x);padding-right:var(--ax-comp-loading-padding-x)}ax-loading:before,ax-loading:after{content:\"\";top:50%;width:100%;height:100%;position:absolute;border-radius:9999px;inset-inline-start:50%;transform:translate(-50%,-50%) scale(var(--ax-comp-loading-inner-scale));background-color:transparent;animation:var(--ax-comp-loading-animation-duration) ease-in-out both ax-pulse;animation-iteration-count:infinite}@keyframes ax-pulse{50%{transform:scale3d(var(--ax-comp-loading-pulse-scale),var(--ax-comp-loading-pulse-scale),var(--ax-comp-loading-pulse-scale))}}ax-loading ax-loading-spinner{display:flex;gap:var(--ax-comp-loading-spinner-gap)}.ax-loading-overlay-backdrop{opacity:var(--ax-comp-loading-overlay-opacity);background-color:rgba(var(--ax-comp-loading-overlay-bg-color, var(--ax-sys-color-surface)))}.ax-loading-pane{top:0;bottom:0;inset-inline-end:0px;inset-inline-start:0px;width:100%!important;height:100%!important}.ax-loading-pane .cdk-dialog-container{display:flex!important;align-items:center;justify-content:center}.ax-loading-pane .cdk-dialog-container:focus,.ax-loading-pane .cdk-dialog-container:focus-visible,.ax-loading-pane .cdk-dialog-container:focus-within{outline-style:solid;outline-color:transparent;outline-width:var(--ax-comp-loading-pane-outline-width);outline-offset:var(--ax-comp-loading-pane-outline-offset)}\n"] }]
        }], propDecorators: { visibleChange: [{
                type: Output
            }], visible: [{
                type: Input
            }], type: [{
                type: Input
            }], context: [{
                type: Input
            }] } });

const DEFAULT_LOADER_ID = '_DEFAULT';
class AXLoadingService {
    constructor() {
        // WeakMap will remove components from itself upon
        // their garbage collection by JS runtime.
        this.loadingStates = new WeakMap();
        // Both loading state maps are kept in-sync such that
        // they can be used by both sync and async methods.
        this.loadingStates$ = new WeakMap();
        this.dialog = inject(Dialog);
    }
    /**
     * Shows a modal loading overlay.
     *
     * If a host element is provided via `config.location`, the overlay is attached to that
     * element; otherwise it is attached to `document.body`.
     *
     * @param config Optional configuration: host `location`, `type`, and `context` passed to the spinner instance.
     * @returns number Unique loading reference id to be used with {@link hide}.
     */
    show(config) {
        const ce = (config?.location ?? document.body);
        const dialogRef = this.dialog.open(AXLoadingComponent, {
            hasBackdrop: true,
            disableClose: true,
            restoreFocus: true,
            closeOnDestroy: true,
            closeOnNavigation: true,
            ariaModal: true,
            role: 'alertdialog',
            panelClass: ['ax-loading-pane', 'ax-animate-fadeIn'],
            backdropClass: ['ax-loading-overlay-backdrop', 'ax-animate-fadeIn'],
        });
        const id = new Date().getTime();
        dialogRef.componentInstance.visible = true;
        dialogRef.componentInstance.id = id.toString();
        if (ce != document.body) {
            const bg = dialogRef.overlayRef.backdropElement;
            const ov = dialogRef.overlayRef.overlayElement;
            ce.style.position = 'relative';
            ov.style.position = 'absolute';
            ce.appendChild(bg);
            ce.appendChild(ov);
            setTimeout(() => {
                ov.style.position = 'absolute';
            });
        }
        return id;
        // TODO: diabled focus and click, maybe we need a service and directive for it
    }
    /**
     * Hides a previously shown modal loading overlay.
     *
     * @param id Loading reference id returned by {@link show}.
     */
    hide(id) {
        const f = this.dialog.openDialogs.find((c) => c.componentInstance.id === id.toString());
        if (f) {
            f.close();
        }
    }
    /**
     * Wraps an Observable and toggles loading for its duration.
     *
     * Starts loading before subscription settles and ends loading on finalize.
     *
     * @param source$ Source observable.
     * @param context Loading context key.
     * @param loaderId Optional id to scope multiple loaders per context.
     * @returns Observable<V> The original stream with loading side effects.
     */
    doLoading(source$, context, loaderId) {
        this.startLoading(context, loaderId);
        return source$.pipe(observeOn(asyncScheduler), finalize(() => this.endLoading(context, loaderId)));
    }
    /**
     * Returns current loading state for the given context and optional loader id.
     *
     * @param context Loading context key.
     * @param loaderId Optional loader id.
     * @returns boolean True if any matching loader is active.
     */
    isLoading(context, loaderId) {
        const loaderStates = this.loadingStates.get(context);
        if (!loaderStates) {
            return false;
        }
        else {
            if (loaderId !== undefined) {
                return loaderStates.get(this.getLoaderId(loaderId)) ?? false;
            }
            else {
                return [...loaderStates.values()].filter((state) => state).length > 0;
            }
        }
    }
    /**
     * Observable loading state for the given context and optional loader id.
     * Initializes the state if it does not exist yet.
     *
     * @param context Loading context key.
     * @param loaderId Optional loader id.
     * @returns Observable<boolean>
     */
    isLoading$(context, loaderId) {
        const coalescedLoaderId = this.getLoaderId(loaderId);
        if (!this.hasLoadingStates(context, coalescedLoaderId)) {
            this.setLoadingState(context, false, loaderId);
        }
        return this.loadingStates$.get(context).get(coalescedLoaderId);
    }
    /**
     * Sets loading state to true for the given context/loader id.
     *
     * @param context Loading context key.
     * @param loaderId Optional loader id.
     * @returns void
     */
    startLoading(context, loaderId) {
        this.setLoadingState(context, true, this.getLoaderId(loaderId));
    }
    /**
     * Sets loading state to false for the given context/loader id.
     *
     * @param context Loading context key.
     * @param loaderId Optional loader id.
     * @returns void
     */
    endLoading(context, loaderId) {
        this.setLoadingState(context, false, this.getLoaderId(loaderId));
    }
    /**
     * Clears all tracked loading states across all contexts.
     *
     * @returns void
     */
    clearLoadings() {
        this.loadingStates = new WeakMap();
        this.loadingStates$ = new WeakMap();
    }
    setLoadingState(context, state, loaderId) {
        if (!this.hasLoadingStates(context, loaderId)) {
            if (this.hasContextLoadingState(context)) {
                this.loadingStates.get(context).set(loaderId, state);
                this.loadingStates$.get(context).set(loaderId, new BehaviorSubject(state));
            }
            else {
                this.loadingStates.set(context, new Map([[loaderId, state]]));
                this.loadingStates$.set(context, new Map([[loaderId, new BehaviorSubject(state)]]));
            }
        }
        else {
            this.loadingStates.get(context).set(loaderId, state);
            this.loadingStates$.get(context).get(loaderId).next(state);
        }
    }
    hasLoadingStates(context, loaderId) {
        return this.hasContextLoadingState(context) && this.hasLoaderLoadingState(context, loaderId);
    }
    hasContextLoadingState(context) {
        return this.loadingStates.has(context) && this.loadingStates$.has(context);
    }
    hasLoaderLoadingState(context, loaderId) {
        return this.loadingStates.get(context).has(loaderId) && this.loadingStates$.get(context).has(loaderId);
    }
    getLoaderId(loaderId) {
        return loaderId ?? DEFAULT_LOADER_ID;
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
    static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingService, decorators: [{
            type: Injectable,
            args: [{
                    providedIn: 'root',
                }]
        }] });

// This directive places an overlay with a loading spinner over its host element
// if isLoading equals to true and hides the overlay when isLoading becomes false.
class AXLoadingDirective {
    get isLoading() {
        return this._isLoading;
    }
    set isLoading(v) {
        this._isLoading = v;
        if (v) {
            this._loadingRef = this.loadingService.show({
                location: this._hostElement,
            });
        }
        else {
            this.loadingService.hide(this._loadingRef);
        }
    }
    constructor() {
        this.elementRef = inject(ElementRef);
        this.loadingService = inject(AXLoadingService);
        this._hostElement = this.elementRef.nativeElement;
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
    static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.15", type: AXLoadingDirective, isStandalone: true, selector: "[axIsLoading]", inputs: { isLoading: ["axIsLoading", "isLoading"] }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingDirective, decorators: [{
            type: Directive,
            args: [{ selector: '[axIsLoading]' }]
        }], ctorParameters: () => [], propDecorators: { isLoading: [{
                type: Input,
                args: ['axIsLoading']
            }] } });

class AXLoadingModule {
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
    static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingModule, imports: [AXLoadingComponent, AXLoadingDirective, AXLoadingSpinnerComponent], exports: [AXLoadingComponent, AXLoadingDirective, AXLoadingSpinnerComponent] }); }
    static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingModule }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: AXLoadingModule, decorators: [{
            type: NgModule,
            args: [{
                    imports: [AXLoadingComponent, AXLoadingDirective, AXLoadingSpinnerComponent],
                    exports: [AXLoadingComponent, AXLoadingDirective, AXLoadingSpinnerComponent],
                }]
        }] });

/**
 * Generated bundle index. Do not edit.
 */

export { AXLoadingComponent, AXLoadingDefaultConfig, AXLoadingDirective, AXLoadingModule, AXLoadingService, AXLoadingSpinnerComponent, AX_LOADING_CONFIG, loadingConfig };
//# sourceMappingURL=acorex-components-loading.mjs.map
