From ac42ce2d670c83239149a6684095343f28546b3f Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Fri, 17 Apr 2026 10:42:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E5=86=B3=20node=20=E4=B8=8B=20?= =?UTF-8?q?loading=20=E6=8C=89=E9=92=AE=E8=AE=A1=E7=AE=97=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 2 +- packages/remote-control-server/web/render.js | 2 +- src/components/Spinner/utils.ts | 8 +++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a4e0ebfa0..42aace77f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: run: bun test --coverage --coverage-reporter=lcov - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v5 with: file: ./coverage/lcov.info token: ${{ secrets.CODECOV_TOKEN }} diff --git a/packages/remote-control-server/web/render.js b/packages/remote-control-server/web/render.js index 5678ffff1..19100c9a9 100644 --- a/packages/remote-control-server/web/render.js +++ b/packages/remote-control-server/web/render.js @@ -597,7 +597,7 @@ function renderSystemMessage(text) { const LOADING_ID = "loading-indicator"; // TUI star spinner frames (same as Claude Code CLI) -const SPINNER_FRAMES = ["·", "✢", "✳", "✶", "✻", "✽"]; +const SPINNER_FRAMES = ["·", "✢", "✱", "✶", "✻", "✽"]; const SPINNER_CYCLE = [...SPINNER_FRAMES, ...SPINNER_FRAMES.slice().reverse()]; // 204 verbs from TUI src/constants/spinnerVerbs.ts diff --git a/src/components/Spinner/utils.ts b/src/components/Spinner/utils.ts index 0b90a7a59..6c08375c0 100644 --- a/src/components/Spinner/utils.ts +++ b/src/components/Spinner/utils.ts @@ -3,11 +3,13 @@ import type { RGBColor as RGBColorType } from './types.js' export function getDefaultCharacters(): string[] { if (process.env.TERM === 'xterm-ghostty') { - return ['·', '✢', '✳', '✶', '✻', '*'] // Use * instead of ✽ for Ghostty because the latter renders in a way that's slightly offset + return ['·', '✢', '✱', '✶', '✻', '*'] // ✱ replaces ✳ (emoji, renders offset in Ghostty); * replaces ✽ (same) } + // ✳ (U+2733) is matched by emoji-regex in Node.js → stringWidth returns 2 instead of 1, + // causing layout jitter when the spinner cycles frames. ✱ (U+2731) is visually similar but not emoji. return process.platform === 'darwin' - ? ['·', '✢', '✳', '✶', '✻', '✽'] - : ['·', '✢', '*', '✶', '✻', '✽'] + ? ['·', '✢', '✱', '✶', '✻', '✽'] + : ['·', '✢', '✱', '✶', '✻', '✽'] } // Interpolate between two RGB colors