Skip to content

feat(core): indicator styles, the rainbow finish and Prompt tabs (#143) - #147

Merged
Maxaubert merged 6 commits into
mainfrom
feat/143-indicator-styles
Oct 10, 2026
Merged

Maxaubert merged 6 commits into
mainfrom
feat/143-indicator-styles

Conversation

@Maxaubert

Copy link
Copy Markdown
Owner

Closes #143.

Builds the owner's 2026-10-10 decisions: "Let's drop the tab style where ... the tab is fully filled out in that rainbow color. Let's just keep the like that border that moves slowly. The pulsation effect is also now exactly what I want it. And I like the gentle pulse too for questions. Make sure that's also applied to the minimal style for normal tabs."

Spec and plan: docs/superpowers/specs/2026-10-10-indicator-styles-design.md, docs/superpowers/plans/2026-10-10-indicator-styles.md. Mockups (source of truth): research/prism-terminal/mockups/2026-10-10-prompt-style and 2026-10-10-indicators-r4.

What changes

Indicator styles (Settings > Agents > Agent working indicator): Off, Minimal, Ring, Full.

  • Minimal: working is the running bar; finished, question and failed are straight 3 px bottom lines.
  • Ring: the spinner beside the name while working, Minimal's lines after.
  • Full: every marked tab NOT in front is filled solid in its state colour; the tab in front is never filled and shows Minimal's mark. Finished is the icon's dark badge with the rainbow flowing along its foot. Names: the theme's text everywhere, flipped to the opposite only below 2:1 on that state's full colour, decided per colour, never per frame.
  • The old Full (accent fill hiding the active tab) and the brain icon are gone.
  • Question: a gentle pulse to the ground and back (2 s) in every style, Minimal on Classic tabs included.
  • Finished: the app icon's rainbow, flowing (line 8 s a lap, edge 7 s), each colour held to 3:1 on every ground. New switch "Rainbow finished mark", on by default.
  • Failed: steady red. Reduced motion: everything still.

Tab style (Settings > Appearance, right after Tab width): Classic (the strip as it was, default) or Prompt (chevron segments; the arrow edge is the mark, with the approved grow pulse, joining the active tab's top rule). No line between tabs in either style.

Core change: this is a change to Prism too, but Prism's look does not change

The rules (lib/tabMark.ts, markColours.ts, nameInk.ts, markPalette.ts), components/TabMark.tsx and the motion (renderer/styles/marks.css) are in core/. Core 0.27.0 -> 0.28.0, app 0.34.0 -> 0.35.0.

Prism is unchanged until it adopts the marks: it passes no tabMarks, so it keeps Off / Minimal / its own Full, a stored Ring reads as its default, and the rainbow row is not drawn there (that row lives in a new list, markOptions.ts, not in TERMINAL_OPTIONS, for the reason helpOptions.ts gave). Verified against Prism 952e309 with this core linked in a throwaway worktree (nothing committed there): typecheck, the whole unit suite (2656 passed), and the e2e terminal, termOptions, termColourPicker, settingsLook, tabs, agentTitle, promptLayout, all green.

Decisions for you (Ove)

  1. New TermHostConfig field tabMarks (optional). CLAUDE.md makes adding one your decision: yes or no?
  2. Off is kept as a fourth choice: your list named Minimal, Ring and Full, but removing Off would silently change things for anyone who picked it.
  3. "Classic" instead of "Current": a choice cannot be called Current once there are two. One string to change.
  4. Rainbow off under Full: a finished background tab is then filled with the plain finished colour (no badge).
  5. Badge colour #383c44, the mockup's, not the icon's black.
  6. Full on Prompt tabs fills the whole segment.

Tests

  • npm test (1529 passed), npm run typecheck, npm run lint (0 errors).
  • New unit tests: markColours, nameInk, tabMark, markPalette, TabMark, marks.css (every motion has keyframes and a reduced-motion rule), tabStylePrefs, promptGeometry, tabDrop with segments overlapping 9.5 px, the indicator reader and rainbow switch, the segment tokens.
  • E2E: new tabStyle and indicatorStyles (no separator between tabs, Prompt overlap 9.5 px, the edge band flush in the gap and growing, the active rule cut along the slant, the tab in front told apart in every state, Full's name rule on Volt and Paper, the rainbow moves and stands still under reduced motion); updated indicator, attention, colourPicker, edges, options, settingsSearch, themeSwitch. All of these pass. The whole suite was run once: 52 scenarios, 49 green; settingsLook fails the same 8 checks on main (251b23e) too (it predates Switches: on wears the theme's accent with the accent's ink as the knob, in both apps #138's accent-filled switches, not this PR), and quitManyShells (an exit crash at quit) and pathLinks flaked in the full run and passed on a rerun, both green on main.

Screenshots (in .e2e-shots/, compared by eye against the mockups' overview.png): tabs-classic.png, tabs-prompt.png, tabs-prompt-fixed.png, tabs-prompt-light.png, marks-{classic,prompt}-{minimal,ring,full}-{volt,paper}.png, marks-reduced-motion.png, attention-rainbow.png, settings-agents.png.

Installed on this machine for hands-on testing: PrismTerminal-Setup-x64-0.35.0.exe /S, installed version 0.35.0, launched; the Stable copy was not touched.

Unsigned, as every release until the SignPath enrolment.

Merge?

🤖 Generated with Claude Code

https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

Maxaubert and others added 6 commits October 10, 2026 01:22
The owner's decisions of 2026-10-10 (mockups approved, "go ahead and
build"): Classic and Prompt tab styles, Off / Minimal / Ring / Full marks,
the flowing rainbow finish, the question breathe, the Full name flip rule.
Records the core/app split: the marks' rules, motion and rows in the core
behind an optional TermHostConfig.tabMarks so Prism is unchanged until it
adopts them; the tab style and Prompt geometry in this app.

Bumps core to 0.28.0 and the app to 0.35.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t
The pure rules (markColours, nameInk, tabMark, markPalette), the marks'
motion in core/renderer/styles/marks.css, the TabMark component, Ring and
the rainbow switch, tabMarks on TermHostConfig, the Tab style setting and
the Classic and Prompt strips.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t
The strip renders on every pointer move of a tab drag; flooring the mark
colours on every ground each time was work the frame did not need.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t
…yles

# Conflicts:
#	core/package.json
#	docs/regression-rules.md
#	package.json
@Maxaubert
Maxaubert merged commit bded1e2 into main Oct 10, 2026
2 checks passed
github-actions Bot pushed a commit that referenced this pull request Oct 10, 2026
… (#147)

* docs(core): spec and plan for indicator styles and Prompt tabs (#143)

The owner's decisions of 2026-10-10 (mockups approved, "go ahead and
build"): Classic and Prompt tab styles, Off / Minimal / Ring / Full marks,
the flowing rainbow finish, the question breathe, the Full name flip rule.
Records the core/app split: the marks' rules, motion and rows in the core
behind an optional TermHostConfig.tabMarks so Prism is unchanged until it
adopts them; the tab style and Prompt geometry in this app.

Bumps core to 0.28.0 and the app to 0.35.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

* feat(core): indicator styles, the rainbow finish and Prompt tabs (#143)

The pure rules (markColours, nameInk, tabMark, markPalette), the marks'
motion in core/renderer/styles/marks.css, the TabMark component, Ring and
the rainbow switch, tabMarks on TermHostConfig, the Tab style setting and
the Classic and Prompt strips.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

* test(e2e): tab styles and indicator styles measured, no tab separators (#143)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

* docs: the tab marks, the rainbow finish and Prompt tabs (#143)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

* perf(tabs): work out the mark palette only when its inputs change (#143)

The strip renders on every pointer move of a tab drag; flooring the mark
colours on every ground each time was work the frame did not need.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FHHaWKR4M5QtW7Wecyuk4t

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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.

Agent indicator: rethink the Full style, add an ultra-minimal spinner style

1 participant