ngxsmk-button-spinner
Version:
Directive to overlay a loading spinner on any button (Angular 17+).
68 lines (64 loc) • 3.12 kB
TypeScript
import * as i0 from '@angular/core';
import { AfterViewInit, Signal, ElementRef, Renderer2 } from '@angular/core';
interface NgxSmkButtonSpinnerTheme {
/** Spinner color (any CSS color). Default: currentColor */
color?: string;
/** Spinner trail/track color. Default: transparent */
trackColor?: string;
/** Border thickness. Default: 2px */
thickness?: string;
/** Spinner size. Default: 1.2em */
size?: string;
/** Animation speed in ms. Default: 700 */
speedMs?: number;
/** Optional backdrop while loading (rgba recommended). Default: transparent */
dimOverlay?: string;
/** Keep label text visible while loading (overlay mode). Default: false */
keepLabel?: boolean;
}
interface NgxSmkButtonSpinnerOptions {
/** ARIA label for the spinner; default 'Loading' */
ariaLabel?: string;
/** (future-proof) positioning mode; currently only 'overlay' */
mode?: 'overlay';
}
declare class NgxSmkButtonSpinnerDirective implements AfterViewInit {
private readonly el;
private readonly renderer;
/** loading: boolean | Signal<boolean> */
set ngxsmkButtonSpinner(v: boolean | Signal<boolean>);
/** true → overlay/centered (hide label), false → inline after text */
set ngxsmkButtonSpinnerHideLabel(v: boolean | Signal<boolean>);
/** a11y options (setter so we can update aria-label immediately) */
set ngxsmkButtonSpinnerOptions(v: NgxSmkButtonSpinnerOptions | undefined);
/** THEME setter — push CSS vars immediately on every change */
set ngxsmkButtonSpinnerTheme(v: NgxSmkButtonSpinnerTheme | undefined);
private spinnerEl;
private labelEl;
private overlayBoxEl;
private readonly isBrowser;
private _loadingSrc;
private _hideSrc;
private _theme;
private _opts;
constructor(el: ElementRef<HTMLElement>, renderer: Renderer2, platformId: object);
ngAfterViewInit(): void;
private read;
private setLoading;
/** Wrap all existing nodes so we can hide/show label reliably */
private ensureLabelWrapper;
private applyLabelVisibility;
private addSpinner;
private removeSpinner;
/** Create overlay box (grid centered) and move spinner inside it */
private ensureOverlayBox;
private removeOverlayBox;
/** Position spinner depending on mode */
private configureSpinnerLayout;
private applyTheme;
private ensureGlobalStyle;
static ɵfac: i0.ɵɵFactoryDeclaration<NgxSmkButtonSpinnerDirective, never>;
static ɵdir: i0.ɵɵDirectiveDeclaration<NgxSmkButtonSpinnerDirective, "[ngxsmkButtonSpinner]", never, { "ngxsmkButtonSpinner": { "alias": "ngxsmkButtonSpinner"; "required": false; }; "ngxsmkButtonSpinnerHideLabel": { "alias": "ngxsmkButtonSpinnerHideLabel"; "required": false; }; "ngxsmkButtonSpinnerOptions": { "alias": "ngxsmkButtonSpinnerOptions"; "required": false; }; "ngxsmkButtonSpinnerTheme": { "alias": "ngxsmkButtonSpinnerTheme"; "required": false; }; }, {}, never, never, true, never>;
}
export { NgxSmkButtonSpinnerDirective };
export type { NgxSmkButtonSpinnerOptions, NgxSmkButtonSpinnerTheme };