"use strict";
// // #region Imports
// import { on, type IEventListenerSubscription } from '@breadstone/mosaik-elements';
// import type { Nullable } from '../../Types/Nullable';
// import type { ISpinEvent } from '../Components/Primitives/UpDownSpinner/Events/ISpinEventDetail';
// import type { UpDownSpinnerElement } from '../Components/Primitives/UpDownSpinner/UpDownSpinnerElement';
// import { SpinDirection } from './SpinDirection';
// // #endregion
// /**
//  * A abstract `UpDownBase` class.
//  *
//  * @public
//  */
// export abstract class UpDownBase<T> {
//     // #region Fields
//     private _inputChangedSubscription: IEventListenerSubscription | null;
//     private _input: HTMLInputElement;
//     private _min: T;
//     private _max: T;
//     // #endregion
//     // #region Ctor
//     /**
//      * Constructs a new instance of the `UpDownBase` class.
//      *
//      * @protected
//      */
//     protected constructor() {
//         this._input = null as any;
//         this._inputChangedSubscription = null;
//         this._min = undefined as any;
//         this._max = undefined as any;
//     }
//     // #endregion
//     // #region Properties
//     /**
//      * Gets or sets the `min` property.
//      *
//      * @public
//      */
//     // @Input()
//     // @HostBinding('attr.min')
//     public get min(): T {
//         return this._min;
//     }
//     public set min(value: T) {
//         this._min = value;
//     }
//     /**
//      * Gets or sets the `max` property.
//      *
//      * @public
//      */
//     // @Input()
//     // @HostBinding('attr.max')
//     public get max(): T {
//         return this._max;
//     }
//     public set max(value: T) {
//         this._max = value;
//     }
//     /**
//      * Returns the `input` property.
//      *
//      * @protected
//      * @readonly
//      */
//     protected get input(): HTMLInputElement {
//         return this._input;
//     }
//     // #endregion
//     // #region Methods
//     /**
//      * @public
//      */
//     public attach(input: HTMLInputElement): void {
//         this._input = input;
//         this._inputChangedSubscription = on(this._input, 'input', (x) => this.onInputChanged(x));
//     }
//     /**
//      * @public
//      */
//     public detach(): void {
//         this._inputChangedSubscription?.dispose();
//     }
//     /**
//      * @protected
//      * @abstract
//      */
//     protected abstract onInputChanged(event: Event): void;
//     /**
//      * @protected
//      */
//     protected setInputValue(value: string): void {
//         this._input.value = value;
//         this._input.dispatchEvent(new Event('input', { bubbles: true }));
//     }
//     // #endregion
// }
// /**
//  * The `NumberUpDown` class.
//  *
//  * @public
//  */
// export class NumberUpDown extends UpDownBase<number> {
//     // #region Fields
//     private _spinner: Nullable<UpDownSpinnerElement>;
//     private _step: number;
//     private _decimalPlaces: number;
//     private _spinnerSpinedSubscription: IEventListenerSubscription | null;
//     // #endregion
//     // #region Ctor
//     /**
//      * Constructs a new instance of the `NumberUpDown` class.
//      *
//      * @public
//      */
//     public constructor() {
//         super();
//         this._spinner = null;
//         this._step = 0;
//         this._decimalPlaces = 0;
//         this._spinnerSpinedSubscription = null;
//     }
//     // #endregion
//     // #region Properties
//     /**
//      * Gets or sets the `spinner` property.
//      *
//      * @public
//      */
//     // @Input('upDownSpinner')
//     public get spinner(): Nullable<UpDownSpinnerElement> {
//         return this._spinner;
//     }
//     public set spinner(value: Nullable<UpDownSpinnerElement>) {
//         this._spinner = value;
//         if (this._spinner) {
//             this._spinnerSpinedSubscription?.dispose();
//             this._spinnerSpinedSubscription = on(this._spinner, 'spinned', (x) => this.onSpined(x));
//         } else {
//             this._spinnerSpinedSubscription?.dispose();
//         }
//     }
//     /**
//      * Gets or sets the `step` property.
//      *
//      * @public
//      */
//     // @Input()
//     // @HostBinding('attr.step')
//     public get step(): number {
//         return this._step;
//     }
//     public set step(value: number) {
//         this._step = value;
//     }
//     /**
//      * Gets or sets the `decimalPlaces` property.
//      *
//      * @public
//      */
//     // @Input()
//     public get decimalPlaces(): number {
//         return this._decimalPlaces;
//     }
//     public set decimalPlaces(value: number) {
//         this._decimalPlaces = value;
//     }
//     // #endregion
//     // #region Methods
//     /**
//      * @public
//      * @override
//      */
//     public override detach(): void {
//         super.detach();
//         this._spinnerSpinedSubscription?.dispose();
//     }
//     /**
//      * @protected
//      */
//     protected onInputChanged(event: Event): void {
//         const input = event.target as HTMLInputElement;
//         const min = this.convertToNumber(input.min, Number.MIN_SAFE_INTEGER);
//         const max = this.convertToNumber(input.max, Number.MAX_SAFE_INTEGER);
//         const value = this.convertToNumber(input.value, 0);
//         const imposedValue = this.imposeMinMax(value, min, max);
//         if (this._spinner) {
//             this._spinner.increaseDisabled = !(value < max);
//             this._spinner.decreaseDisabled = !(value > min);
//         }
//         if (value !== imposedValue || input.valueAsNumber !== imposedValue) {
//             this.setInputValue(imposedValue.toFixed(this._decimalPlaces));
//         }
//     }
//     /**
//      * @private
//      */
//     private onSpined(event: ISpinEvent): void {
//         const input = this.input;
//         input.focus();
//         const min = this.convertToNumber(input.min, Number.MIN_SAFE_INTEGER);
//         const max = this.convertToNumber(input.max, Number.MAX_SAFE_INTEGER);
//         let value = this.convertToNumber(this.input.value, 0);
//         value = this.imposeMinMax(value, min, max);
//         if (event.detail.direction === SpinDirection.Increase) {
//             const newValue = Number.parseFloat((value + this._step).toFixed(this._decimalPlaces));
//             if (newValue < max) {
//                 this.setInputValue(newValue.toString());
//                 event.target.increaseDisabled = false;
//             } else {
//                 this.setInputValue(max.toString());
//                 event.target.increaseDisabled = event.detail.cancel = true;
//             }
//         }
//         if (event.detail.direction === SpinDirection.Decrease) {
//             const newValue = Number.parseFloat((value - this._step).toFixed(this._decimalPlaces));
//             if (newValue > min) {
//                 this.setInputValue(newValue.toString());
//                 event.target.decreaseDisabled = false;
//             } else {
//                 this.setInputValue(min.toString());
//                 event.target.decreaseDisabled = event.detail.cancel = true;
//             }
//         }
//     }
//     /**
//      * @private
//      */
//     private convertToNumber(value: string, fallback: number): number {
//         const float = Number.parseFloat(Number.parseFloat(value).toFixed(this._decimalPlaces));
//         return Number.isNaN(float)
//             ? fallback
//             : float;
//     }
//     /**
//      * @private
//      */
//     private imposeMinMax(value: number, min: number, max: number): number {
//         return value < min
//             ? min
//             : value > max
//                 ? max
//                 : value;
//     }
//     // #endregion
// }
//# sourceMappingURL=UpDown.js.map