Skip to content

Catalyst v0.4.0

Choose a tag to compare

@a-fleming a-fleming released this 28 Jun 06:35

v0.4.0 - XP and karma delta display on all leaderboards, stability fixes

  • Added XP and karma delta to every leaderboard entry — each card other than your own shows how far ahead (green) or behind (red) you are. Shown on the extension's Top All-Time Learners panel, all three Personal Leaderboards boards (daily XP, all-time XP, karma), and all four native boot.dev boards: League Top Daily Learners, League Top League Learners, Global Top Daily Learners, and Global Top Community Members. (Recent Archmages is left untouched — it lists no XP or karma.)
  • Each delta is aligned with the value it compares against: native deltas are appended into the card's text column directly beneath the native value, and the extension panels' deltas sit with their own value. Dropped the redundant " today" suffix from daily deltas.
  • Intercepted /v1/leaderboard_karma/alltime and /v1/league_leaderboard_xp/{day,alltime}. Each board is matched to the API response that feeds it, and the current user's own value is read from that same response (XPEarned for league/daily, Karma for community, XP for all-time), so deltas always match the displayed numbers; getMyValue prefers these responses and falls back to the saved personal record only when absent.
  • Scoped native cards by document position between known section titles, so the dynamic "You are in position N…" subtitle (an <h3> in the Global boards) no longer truncates a section's card range and blanks its deltas.
  • Eliminated leaderboard flicker: each panel is rendered once and then reconciled in place keyed by handle instead of replacing innerHTML, so the current-user card and its gold glow are never destroyed and recreated, unchanged rows are untouched, and only changed values patch a single text node (native deltas included). Supporting changes: a 50 ms debounced render scheduler, a fast-path and version-guarded waitFor so stale resolutions can't overwrite a newer render, a persistent Personal Leaderboards skeleton that keeps the input's value and focus, and a compareDocumentPosition check that repositions the personal panel without re-rendering.
  • Stabilized current-user identity, the deeper cause of the residual glow flicker and intermittently wrong deltas. boot.dev's leaderboard cards are not inside <main>, so the nav-link heuristic could match a scrolled-past profile card and overwrite the stored handle mid-scroll. The handle is now sticky once known and taken authoritatively from the native gold-glow highlight (which only ever marks your own cards); the nav heuristic can no longer overwrite a known handle.
  • Corrected the avatar role-frame tier map using confirmed API data: added the missing Mage tier (level 90–99), restored the Archmage index (level 100+), and shifted the level formula down one step so all tiers render the correct frame; entries with no recognized role and a level below 10 (or no level) show no frame.
  • Matched the current-user card glow to the native site value (0 0 15px 1px #e5a012) on both the all-time and personal rows.
  • Matched the boss panel minimized-state title font size to the expanded title (both 16 px) and widened the panel to prevent title truncation at maximum aura length.

Infrastructure

  • Split src/content.js (2059 lines) into feature modules: utils.js, leaderboard.js, profile.js, boss.js, nextLesson.js, and a slim router-only content.js.
  • Created CLAUDE.md with agent guidance, file responsibilities, architecture rules, and quick-check commands.