{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/components/loader.ts"],"names":[],"mappings":"AACA,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;;;;;GAKG;AACH,qBAAa,MAAO,SAAQ,IAAI;IAU9B,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,OAAO;IAEf,OAAO,CAAC,WAAW;IAbpB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,EAAE,CAAoB;IAE9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IAExC,YACC,EAAE,EAAE,GAAG,EACC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EACvC,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,EACvC,OAAO,GAAE,MAAqB,EACtC,OAAO,CAAC,EAAE,WAAW,GAAG,cAAc,EAC9B,WAAW,UAAQ,EAM3B;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9B;IAED,KAAK,SAMJ;IAED,IAAI,SAKH;IAED,UAAU,CAAC,OAAO,EAAE,MAAM,QAGzB;IAED,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI,CAKtD;IAED,OAAO,CAAC,aAAa;CAYrB","sourcesContent":["import { formatElapsed } from \"../format-elapsed.js\";\nimport { getSpinner, SPINNERS, type SpinnerName, type SpinnerVariant } from \"../spinners.js\";\nimport type { TUI } from \"../tui.js\";\nimport { Text } from \"./text.js\";\n\n/**\n * Loader component that updates with a spinning animation.\n *\n * Uses the shared spinners library (`SPINNERS.breathe` by default). Pass\n * `variant: \"scan\" | \"helix\" | ...` to swap the frame set.\n */\nexport class Loader extends Text {\n\tprivate spinner: SpinnerVariant;\n\tprivate currentFrame = 0;\n\tprivate intervalId: NodeJS.Timeout | null = null;\n\tprivate ui: TUI | null = null;\n\t// Set once at construction so setVariant()'s stop/start never resets elapsed.\n\tprivate readonly startTime = Date.now();\n\n\tconstructor(\n\t\tui: TUI,\n\t\tprivate spinnerColorFn: (str: string) => string,\n\t\tprivate messageColorFn: (str: string) => string,\n\t\tprivate message: string = \"Loading...\",\n\t\tvariant?: SpinnerName | SpinnerVariant,\n\t\tprivate showElapsed = false,\n\t) {\n\t\tsuper(\"\", 1, 0);\n\t\tthis.ui = ui;\n\t\tthis.spinner = resolveVariant(variant);\n\t\tthis.start();\n\t}\n\n\trender(width: number): string[] {\n\t\treturn [\"\", ...super.render(width)];\n\t}\n\n\tstart() {\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() {\n\t\tif (this.intervalId) {\n\t\t\tclearInterval(this.intervalId);\n\t\t\tthis.intervalId = null;\n\t\t}\n\t}\n\n\tsetMessage(message: string) {\n\t\tthis.message = message;\n\t\tthis.updateDisplay();\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\tprivate updateDisplay() {\n\t\tconst frame = this.spinner.frames[this.currentFrame];\n\t\tlet line = `${this.spinnerColorFn(frame)} ${this.messageColorFn(this.message)}`;\n\t\tif (this.showElapsed) {\n\t\t\tconst elapsed = formatElapsed(Date.now() - this.startTime);\n\t\t\tline += ` ${this.messageColorFn(`(${elapsed})`)}`;\n\t\t}\n\t\tthis.setText(line);\n\t\tif (this.ui) {\n\t\t\tthis.ui.requestRender();\n\t\t}\n\t}\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"]}