{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/components/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,cAAc;IAC9B,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,qBAAa,OAAQ,SAAQ,IAAI;IAChC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,EAAE,CAAa;IAEvB,YAAY,EAAE,EAAE,GAAG,GAAG,IAAI,EAAE,OAAO,GAAE,cAAmB,EAQvD;IAED,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI,CAKtD;IAED,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAGhC;IAED,UAAU,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAG7C;IAED,KAAK,IAAI,IAAI,CAOZ;IAED,IAAI,IAAI,IAAI,CAKX;IAED,OAAO,IAAI,IAAI,CAEd;IAED,OAAO,CAAC,aAAa;CAQrB","sourcesContent":["import { getSpinner, SPINNERS, type SpinnerName, type SpinnerVariant } from \"../spinners.js\";\nimport type { TUI } from \"../tui.js\";\nimport { Text } from \"./text.js\";\n\nexport interface SpinnerOptions {\n\tvariant?: SpinnerName | SpinnerVariant;\n\tcolorFn?: (text: string) => string;\n\tmessage?: string;\n\tmessageColorFn?: (text: string) => string;\n\tpaddingX?: number;\n\tpaddingY?: number;\n}\n\n/**\n * Standalone spinner that drives its own animation timer.\n *\n * Subclasses Text so it composes inside any Container that already renders Text.\n * Call dispose() (or removeChild on the parent) to release the timer.\n */\nexport class Spinner extends Text {\n\tprivate spinner: SpinnerVariant;\n\tprivate colorFn: (text: string) => string;\n\tprivate messageColorFn: (text: string) => string;\n\tprivate message: string;\n\tprivate currentFrame = 0;\n\tprivate intervalId: NodeJS.Timeout | null = null;\n\tprivate ui: TUI | null;\n\n\tconstructor(ui: TUI | null, options: SpinnerOptions = {}) {\n\t\tsuper(\"\", options.paddingX ?? 1, options.paddingY ?? 0);\n\t\tthis.ui = ui;\n\t\tthis.spinner = resolveVariant(options.variant);\n\t\tthis.colorFn = options.colorFn ?? identity;\n\t\tthis.messageColorFn = options.messageColorFn ?? identity;\n\t\tthis.message = options.message ?? \"\";\n\t\tthis.start();\n\t}\n\n\tsetVariant(variant: SpinnerName | SpinnerVariant): void {\n\t\tthis.stop();\n\t\tthis.spinner = resolveVariant(variant);\n\t\tthis.currentFrame = 0;\n\t\tthis.start();\n\t}\n\n\tsetMessage(message: string): void {\n\t\tthis.message = message;\n\t\tthis.updateDisplay();\n\t}\n\n\tsetColorFn(fn: (text: string) => string): void {\n\t\tthis.colorFn = fn;\n\t\tthis.updateDisplay();\n\t}\n\n\tstart(): void {\n\t\tif (this.intervalId) return;\n\t\tthis.updateDisplay();\n\t\tthis.intervalId = setInterval(() => {\n\t\t\tthis.currentFrame = (this.currentFrame + 1) % this.spinner.frames.length;\n\t\t\tthis.updateDisplay();\n\t\t}, this.spinner.interval);\n\t}\n\n\tstop(): void {\n\t\tif (this.intervalId) {\n\t\t\tclearInterval(this.intervalId);\n\t\t\tthis.intervalId = null;\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.stop();\n\t}\n\n\tprivate updateDisplay(): void {\n\t\tconst frame = this.spinner.frames[this.currentFrame];\n\t\tconst composed = this.message\n\t\t\t? `${this.colorFn(frame)} ${this.messageColorFn(this.message)}`\n\t\t\t: this.colorFn(frame);\n\t\tthis.setText(composed);\n\t\tthis.ui?.requestRender();\n\t}\n}\n\nfunction identity(text: string): string {\n\treturn text;\n}\n\nfunction resolveVariant(input?: SpinnerName | SpinnerVariant): SpinnerVariant {\n\tif (!input) return SPINNERS.breathe;\n\tif (typeof input === \"string\") return getSpinner(input, \"breathe\");\n\treturn input;\n}\n"]}