Skip to content

fix(tui): use braille dots for the active task/status spinner - #16

Merged
elkaix merged 1 commit into
mainfrom
fix/thinking-spinner-braille-dots
May 29, 2026
Merged

fix(tui): use braille dots for the active task/status spinner#16
elkaix merged 1 commit into
mainfrom
fix/thinking-spinner-braille-dots

Conversation

@elkaix

@elkaix elkaix commented May 29, 2026

Copy link
Copy Markdown
Member

Summary

Standardizes the working/thinking indicator on a single animation. The active task/status marker previously animated through pulsing star glyphs (✦ ✧ ✶ ✷ ✸ ✹); it now uses the same braille dotted frames (⠋ ⠙ ⠹ ⠸ ⠼ ⠴ ⠦ ⠧ ⠇ ⠏) already used by the bottom thinking-word spinner.

Changes

  • ui/shell/glyphs.py: ACTIVE_MARKER_FRAMES now aliases SPINNER_FRAMES (braille); STAR_SPINNER_FRAMES kept as a backward-compatible alias. The static / reduced-motion active marker (TRANSCRIPT_ACTIVE_MARKER) becomes the calm dot instead of a static star .
  • ui/shell/motion.py: active_marker_frame() drives the braille frames via spinner_frame_at.
  • ui/shell/tool_renderers/_render_utils.py: docstring wording.
  • Tests updated to assert braille frames and the reduced-motion glyph (test_shell_motion, test_render_hardening, test_live_view_todos, test_live_view_notifications).

Verification

  • ruff check + ruff format --check: clean
  • pyright: 0 errors
  • tests/ui_and_conv/test_shell_motion.py, test_render_hardening.py, test_live_view_todos.py, test_live_view_notifications.py, test_spinner_words.py: all green
  • No remaining star-spinner glyphs in ui/ source

Note: the static ✻ Cogitated for Xs completed-thinking trace marker is intentionally left unchanged (it is a one-shot status glyph, not the animated spinner). Say the word if that should also change.

Summary by CodeRabbit

  • Style
    • Animated spinner/active markers now use braille dot frames instead of star symbols for more consistent visual feedback; reduced-motion falls back to a static dot.
  • Documentation
    • Loading/active-marker wording clarified to reflect the braille spinner usage.
  • Tests
    • UI tests updated to match the new braille-dot visuals and reduced-motion behavior.

Review Change Stack

@coderabbitai

coderabbitai Bot commented May 29, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 6337ce48-ea12-48c5-9078-3093fa574e84

📥 Commits

Reviewing files that changed from the base of the PR and between 53c58f9 and f145dbb.

📒 Files selected for processing (7)
  • src/pythinker_code/ui/shell/glyphs.py
  • src/pythinker_code/ui/shell/motion.py
  • src/pythinker_code/ui/shell/tool_renderers/_render_utils.py
  • tests/ui_and_conv/test_live_view_notifications.py
  • tests/ui_and_conv/test_live_view_todos.py
  • tests/ui_and_conv/test_render_hardening.py
  • tests/ui_and_conv/test_shell_motion.py

📝 Walkthrough

Walkthrough

The PR consolidates shell active-marker animation glyphs from a separate star-frame sequence to the shared braille spinner frames. glyphs.py establishes new canonical ACTIVE_MARKER_FRAMES/ACTIVE_MARKER_FRAME_INTERVAL_S constants aliased to spinner frames, repoints legacy STAR_SPINNER_* names for backward compatibility, and updates TRANSCRIPT_ACTIVE_MARKER to use the reduced-motion glyph. motion.py refactors active_marker_frame() to use the centralized frames. All tests update UI assertions and frame verification to expect braille dots instead of stars.

Changes

Active Marker Glyph Consolidation

Layer / File(s) Summary
Glyph constant centralization
src/pythinker_code/ui/shell/glyphs.py
ACTIVE_MARKER_FRAMES and ACTIVE_MARKER_FRAME_INTERVAL_S are introduced as canonical aliases to the braille spinner frames. Legacy STAR_SPINNER_* constants repoint to these aliases for backward compatibility. TRANSCRIPT_ACTIVE_MARKER shifts from a fixed star () to REDUCED_MOTION_GLYPH. Public exports updated in __all__.
Motion layer animation refactor
src/pythinker_code/ui/shell/motion.py
Imports replace star-specific constants with active-marker constants. active_marker_frame() delegates to spinner_frame_at() using the new ACTIVE_MARKER_FRAMES and interval, while reduced-motion still returns TRANSCRIPT_ACTIVE_MARKER.
Test validation for centralized frames
tests/ui_and_conv/test_render_hardening.py, tests/ui_and_conv/test_shell_motion.py, tests/ui_and_conv/test_live_view_notifications.py, tests/ui_and_conv/test_live_view_todos.py
test_render_hardening.py asserts active-marker frames/interval match spinner frames/interval. test_shell_motion.py replaces star-frame tests with braille-dot frame tests and verifies reduced-motion returns REDUCED_MOTION_GLYPH. Pinned-todo rendering tests in notifications and todos expect the dot marker () instead of star ().
Documentation update
src/pythinker_code/ui/shell/tool_renderers/_render_utils.py
loading_marker docstring clarifies the animated braille spinner is reserved for pinned todo header/status lines.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Suggested labels

bug

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 15.38% which is insufficient. The required threshold is 70.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title follows conventional commits format with valid 'fix' type and clear scope/description matching the main change.
Description check ✅ Passed The description is comprehensive, covering changes across multiple files, verification steps, and backward compatibility. All template sections are addressed.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/thinking-spinner-braille-dots

Comment @coderabbitai help to get the list of available commands and usage tips.

Replace the pulsing-star active-marker animation (✦✧✶✷✸✹) with the same
braille dotted frames used by the bottom thinking-word spinner, so the
working/thinking indicator is a single standardized animation. The active
marker now reuses SPINNER_FRAMES via ACTIVE_MARKER_FRAMES; STAR_SPINNER_FRAMES
is kept as a backward-compatible alias. The reduced-motion / static active
marker becomes the calm dot (●) instead of a static star.

Tests updated to assert braille frames and the dot reduced-motion glyph.
@elkaix
elkaix force-pushed the fix/thinking-spinner-braille-dots branch from 53c58f9 to f145dbb Compare May 29, 2026 18:54
@elkaix
elkaix merged commit 8a8f266 into main May 29, 2026
20 checks passed
@elkaix
elkaix deleted the fix/thinking-spinner-braille-dots branch May 29, 2026 19:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant