Skip to content

feat(compact): dual-account mode (o/x), dual Antigravity pools, asymmetric hover crossfade, and pace ticks - #184

Open
fix2it wants to merge 17 commits into
CodeZeno:mainfrom
fix2it:feature/antigravity-hover-crossfade
Open

fix2it wants to merge 17 commits into
CodeZeno:mainfrom
fix2it:feature/antigravity-hover-crossfade

Conversation

@fix2it

@fix2it fix2it commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Summary

This PR brings a comprehensive set of visual and engine enhancements to the Compact Fluent Quad theme and the windowing engine:

  1. Dual-Account Mode (o / x) for Claude Code and OpenAI Codex: enables running two accounts concurrently side-by-side in the taskbar with ultra-compact markers.
  2. Dual Antigravity Pools: displays both Gemini and Claude/GPT pools simultaneously with stacked 5-hour and 7-day gauges and distinct color grading.
  3. Asymmetric 200ms Hover Crossfade: smooth on-demand inspection of weekly limits on hover, eliminating double-exposure ghosting.
  4. Pace Tick Indicator: optional expected usage pace markers with a native context menu toggle.
  5. Engine & Hit-Test Refactoring: consolidated animation ticking, single-lock O(1) hover hit testing, and safe Win32 timer lifecycle.

Preview

ZoomIt 2026-10-29 174917

1. Multi-Account Support (o / x markers)


2. Antigravity Dual Pools & Visual Hierarchy

  • Concurrent Rows:
    • Row 1: Gemini Models (dominant 6 px 5-hour bar + secondary 3 px 7-day bar underneath).
    • Row 2: Claude & GPT Models (dominant 6 px 5-hour bar + secondary 3 px 7-day bar underneath).
  • Color Differentiation:
    • Gemini: Vibrant Teal (#5EEAD4 5h, #0D9488 7d).
    • Claude & GPT: Soft Sky / Steel Blue (#98D0E0 5h, #4A8B9E 7d).
    • Claude Terracotta: Restored standard #D97757 for 5h, with darkened #A44525 for 7d.
  • Solo Mode: If only one pool is enabled, hovering smoothly crossfades between 5h and 7d without mid-transition brightness dips.

3. Asymmetric Hover Crossfade (200 ms)

  • Replaced linear crossfading with asymmetric_crossfade_opacities(progress):
    • Outgoing state fades out quickly ($0.0 \to 0.35$).
    • Incoming state fades in with early lead-in ($0.25 \to 1.0$).
    • Completely eliminates "double-exposure" text ghosting while preventing brightness dips at the midpoint.

4. Pace Ticks

  • Displays a subtle 1 px vertical tick on usage gauges showing the expected pacing for the current time window.
  • Includes context menu toggle ("Show pace" / "Показывать темп") and accounts for late server resets.

5. Architectural & DX Refactoring

  • CrossfadeAnimation::tick_slot: abstracts frame throttling (15 ms), elapsed time interpolation, and slot completion across all providers.
  • Safe Timer Lifecycles: AppState::is_any_crossfade_animating and stop_crossfade_timer_if_idle centralize Win32 WM_TIMER teardown, preventing timer starvation or premature cancellation.
  • $O(1)$ Hit-Testing: tile_hover_at consolidates DPI scaling and surface checks into a single state acquisition per mouse move.
  • Semantic Profile Queries: ProviderAccounts::is_profile_enabled and AppState::is_dual_mode_active.

Verification & Test Suite

  • Full Test Suite: All 612 unit and integration tests pass cleanly (cargo test).
  • Formatting: Checked with cargo fmt --check.
  • Live Verification: Verified on Windows 11 taskbar in both Dark and Light themes.

@fix2it
fix2it force-pushed the feature/antigravity-hover-crossfade branch from d36b0fe to 57b5923 Compare October 26, 2026 08:42
@fix2it fix2it changed the title feat(antigravity): reimagined pool alternating — smooth on-demand hover crossfade for dual & single pool modes feat(compact): dual-account mode (o/x), dual Antigravity pools, asymmetric hover crossfade, and pace ticks Oct 29, 2026
fix2it and others added 17 commits November 3, 2026 10:52
Draw a 1 px tick on each Claude, Codex and Antigravity 5-hour and weekly
gauge in the compact theme at the share of the window that has elapsed
(remaining mode: 100 - elapsed). The engine exposes
{window}.expected / expected_display / expected_available. Settings menu
gets "Show pace" (on by default, display.show_pace binding).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Allow a minute of slack past the window length so poll latency right
after a reset does not hide the tick; it sits at 0 instead.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ssfade

Replaces the background 8s / 2s cyclical timer between Antigravity's
Gemini and Claude/GPT pools with an interactive, smooth hover crossfade
on the taskbar tile.

- Show primary pool at rest (Gemini in dual-mode, or the enabled solo pool).
- Smoothly crossfade to the secondary pool over 180 ms while hovered.
- Continuous time-based animation (CrossfadeAnimation) for fluid 60 FPS transitions.
- O(1) cached tile bounds hit-testing in WM_MOUSEMOVE with auto-invalidation on
  theme reload, DPI change, or provider count updates.
- Remove obsolete periodic timer machinery and dual_mode gate leftovers.
- Add comprehensive unit tests for dual and single pool crossfade modes.
…sfade and pace ticks

- Claude Code dual profile support (Main and X) with dynamic tile width, styled o/x markers, and warm terracotta color scheme
- Antigravity dual pool layout (Row 1 Gemini, Row 2 External) with 5h session and 7d weekly gauges and pace ticks
- Unified 300ms hover crossfade animation across all three dual-mode providers with coordinated timer lifecycle
- All 64 pace ticks aligned and verified across dark and light themes
- Full 14-locale localization for Claude dual-mode menu controls
The OpenCode Console API requires an Authorization: Bearer <token> header
and returns HTTP 401 when only the Cookie header is present.

- Extract the bare token from auth_cookie (stripping the 'auth=' prefix
  if present) and send it as Authorization: Bearer alongside the existing
  Cookie header.
- Verified live against the OpenCode Console API: Bearer returns 200 OK
  with full quota data; Cookie-only returns 401 Unauthorized.
Extend console_request_sends_workspace_context_and_normalizes_auth_cookie
to verify that the Authorization: Bearer header carries the correct bare
token for all seven cookie-format inputs.  Covers the gap identified in
code review round 1 (F4-1).
When auth_cookie contains 'auth=; ...' (auth key present but blank value),
strip_prefix now returns '' which is RFC 6750-invalid as a Bearer token.
Add .filter(|s| !s.is_empty()) so an empty auth= segment is skipped and
unwrap_or falls back to the full cookie string instead.

Also align the test oracle with the same filter so the assertion for the
'auth=; __Host-console_session=SessionToken' input correctly expects the
full raw string as the Bearer value rather than an empty token.
…ailable

- Extract bearer_token as Option<&str>: use stripped auth= value if present and non-empty,
  or fall back to the raw string only if it is a single-segment token without ';'.
- Omit the Authorization header entirely when the credential is a multi-segment
  cookie string lacking an auth= segment, preventing malformed RFC 6750 tokens.
- Update mock request test to assert that Authorization header is absent for
  multi-segment cookies without auth=.
…sertions

- Move extract_bearer_token to dedicated module function.
- Strictly distinguish OAuth / auth tokens from session cookie assignments:
  reject prefixes like '__Host-console_session=' and empty 'auth=' from
  being sent as invalid RFC 6750 Bearer headers.
- Strip trailing/leading spaces inside cookie segments (trim).
- Update console mock test table with explicit independent expected values
  (not mirrored logic).
- Add dedicated unit tests for extract_bearer_token covering bare tokens,
  base64 padding, session cookies, and multi-segment variants.
Translate "Lock in taskbar" in 12 locales and the Cursor token-expiry prompts
in 10 locales; es.toml, pl.toml, th.toml and tr.toml already had translations.
Fix German orthography in de.toml (Fuhren/Offnen/anschliessend). Refresh the
RUSTSEC-2026-0192 exception review date to 2026-12-08 in deny.toml and
docs/dependency-security.md.

Checks: cargo test --locked (629 passed), cargo clippy --locked,
./tests/Test-Dependencies.ps1 (cargo audit + cargo deny), git diff --check.
Independent loop-code-review round 1: 10/10, no in-scope findings at levels 1-4.
@fix2it
fix2it force-pushed the feature/antigravity-hover-crossfade branch from 6d271d6 to 6edc4f6 Compare November 8, 2026 18:53
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