Repository navigation
feat(tui): preview the highlighted widget live while picking - #755
Merged
sirmalloc merged 2 commits intoOct 29, 2026
Merged
Conversation
Seeing what a widget looks like used to mean adding it, looking, and removing it again. While the add/insert/change picker highlights a widget, the status line preview now shows the line exactly as Enter would leave it; ESC or browsing categories restores the line. The new widget's id and powerline background are fixed when the picker opens, so the preview doesn't change color on every keypress and Enter adds exactly what was shown. Preview and apply share one placement helper. A type change drops the widget's label there, as the label editor (sirmalloc#601) does, so the preview shows the line without the old label, as Enter applies it. The picker rendered every entry, so the All category (~90 widgets) or a broad search ran past the bottom of the terminal and scrolled the preview off the top. Picker lists now show only the entries around the selection, sized to the terminal height, the number of status lines and the list's tallest description (wrapped at the terminal width as Ink wraps it), with "↑ N more" / "↓ N more" markers. Entry numbers stay absolute, so position in the full list is still visible.
The category list holds plain strings, so finding the highlighted one needs no callback; a picker with no categories has none highlighted.
axisrow
added a commit
to axisrow/ccstatusline
that referenced
this pull request
Oct 29, 2026
sirmalloc#755 live picker preview, sirmalloc#754 fast mode widget, sirmalloc#753 thinking-effort test stub, sirmalloc#752 transcript block fallback fixes, sirmalloc#751 editor keys no longer pause on global install lookup, sirmalloc#750 git cache TTL starts after the run, sirmalloc#749 npx cache skip, sirmalloc#747 Block Usage hides at 100% and swaps with Block Reset Timer) Conflict policy: upstream infra wins, fork features ported on top. Joins: sirmalloc#750 stamps the git cache after the run while keeping the fork's execGit hardening/env snapshot and daemon prefetch bookkeeping; sirmalloc#752's isApiErrorMessage guard lands in the fork's shared collectTimestampFromLine (sync + async twins), upstream's duplicate getActivityTimestamp dropped; sirmalloc#747 adds SESSION_AT_LIMIT alongside the fork's zero hide state (BlockResetTimer keeps zero + under-limit via isAtSessionLimit, SessionUsage is no-data/zero/at-limit); sirmalloc#755 replaces the fork's picker window + "Showing X-Y of N" note with upstream's renderWindowedList/getPickerMaxVisible and live preview (markers ↑/↓ N more cover the counts); sirmalloc#751's installationState useMemo replaces the fork's inline lookups, the fork's mainMenuIndex helper is kept. Co-Authored-By: Claude Code <noreply@anthropic.com>
pcvelz
added a commit
to pcvelz/ccstatusline-usage
that referenced
this pull request
Oct 29, 2026
Upstream: Extra Usage Limit widget (sirmalloc#756), live widget preview while picking (sirmalloc#755), Fast Mode widget (sirmalloc#754), transcript block fallback fixes (sirmalloc#752), editor keys on a global install (sirmalloc#751), git cache TTL (sirmalloc#750), npx cached copy skip (sirmalloc#749), Block Usage hide at 100% (sirmalloc#747), Block Reset Timer hide until 100% (sirmalloc#697), fish-style branch abbreviation (sirmalloc#614), jj detached HEAD (sirmalloc#705), hooks save warning (sirmalloc#703), dev reload (sirmalloc#700), merge ends at a hidden widget (sirmalloc#698), Block Forecast and Block Limit Timer widgets (sirmalloc#699), contributor guide (sirmalloc#706), POSIX path case fix (sirmalloc#707), whitespace-distinct conflict filenames (sirmalloc#709), Quick Start reorder (sirmalloc#715), bunx launch guidance (sirmalloc#714), jj diff summary counts (sirmalloc#711), powerline manual separators (sirmalloc#713), keychain credential by account (sirmalloc#532), Keychain probe timeout (sirmalloc#760), usage cache scoped per CLAUDE_CONFIG_DIR (sirmalloc#266), test isolation (sirmalloc#717, sirmalloc#753), dev-dependency bumps (sirmalloc#745) Conflicts resolved per the standard-resolution table; fork deletions re-applied. Hand edits outside conflicts: - src/utils/global-command-resolution.ts: fork-rename (ccstatusline@ -> ccstatusline-usage@ in upstream's new bunx pattern) - src/utils/__tests__/global-package-manager.test.ts: fork-rename (package dir ccstatusline-usage in upstream's new tests) - src/utils/usage-fetch.ts: compat fix - cacheUsageData gained a fetchedAtMs arg (upstream sirmalloc#266); adapted the fork-only fetchFreshUsageData call site - src/utils/__tests__/usage-fetch.test.ts: compat fixes - cache/lock now hashed per CLAUDE_CONFIG_DIR (usageFilePath helper) in four fork tests; upstream fableUsage renamed to fork's weeklyFableUsage; seedUsageCache takes TokenHome - src/utils/__tests__/usage-prefetch.test.ts: compat fix - mockFetchUsageData renamed to upstream's mockFetchUsage in cleanly-merged tests - README.md: took upstream's Quick Start move (sirmalloc#715) and dropped the fork's old copy; fork-rename of its ccstatusline@ specifiers; links to fork-deleted docs (docs/USAGE.md, docs/WINDOWS.md) replaced with the fork's inline text - CONTRIBUTING.md: links to the fork-deleted docs/DEVELOPMENT.md pointed at the README Development section - docs/test-retirements.md: ledger entries for the 12 upstream test renames (sirmalloc#697, sirmalloc#698, sirmalloc#700, sirmalloc#705, sirmalloc#713, sirmalloc#760)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Demo
Opening the picker after the last widget, browsing the full list (note the
↓ 72 moremarker), and applying the highlighted widget. Each highlighted widget appears in the preview at the top, and Enter leaves the line exactly as previewed.Powerline
Plain
Summary
Finding out what a widget looks like used to take several key presses: add it, look at the preview, then delete it. Repeating that across the catalog took a long time.
Now, while the add, insert, or change-type picker highlights a widget, the status line preview at the top of the TUI shows the line exactly as pressing Enter would leave it.
Windowed picker lists
The picker used to render every entry. The
Allcategory has about 90 widgets, so it, and broad searches, ran past the bottom of the terminal and scrolled the status line preview off the top. Picker lists now show only the entries around the selection, with↑ N more/↓ N moremarkers.Implementation
items-editor/picker-selection.ts:placePickerSelection()builds the resulting line for add, insert, or change. The preview and the final Enter both use it, so they can't drift apart.items-editor/list-window.ts:getListWindow()keeps the selection centered once the list scrolls.getPickerMaxVisible()sizes the list to fit the terminal.ItemsEditor: the picker reports its candidate line, ornull, through the existingonPreviewChangeprop that label drafts already use, soAppswaps it into whatStatusLinePreviewrenders with no changes of its own. Picker lists render through the windowed list.Testing
placePickerSelection,getListWindow, andgetPickerMaxVisible.bun test: 2380 pass.bun run lint: clean.--configpath wrapping onto two extra lines, only the title scrolls offmain, after feat(tui): opt-in dev reload that restarts the TUI in place #700 merged:bun test3276 pass, 0 fail;bun run lintclean. Built CLI under Bun 1.4.2 and Node 26.10.0: piped renders matchmainin plain and Powerline modes, and the TUI opens and exits cleanly under both.