Skip to content

feat: click-bonus and global-multiplier upgrade tooltip variants (#121) - #123

Merged
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants
Mar 14, 2026
Merged

feat: click-bonus and global-multiplier upgrade tooltip variants (#121)#123
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants

Conversation

@4sh-dev

Copy link
Copy Markdown
Collaborator

Summary

Extends the rich upgrade tooltip system (shipped in PR #120) to the two upgrade types that were explicitly deferred: click-bonus upgrades and global-multiplier (booster) upgrades.

Changes

New pure selector functions (tooltipHelpers.ts)

  • computeClickBonusTooltipData — computes current/future/delta click power for a click upgrade. Excludes combo (transient) but applies the max(1, ...) floor to match the real engine. Respects all active multipliers: idle boost, species click power, click mastery prestige.
  • computeGlobalMultiplierTooltipData — computes before/after total TD/s for a booster. newTdPerSecond = currentTdPerSecond × booster.multiplier.

Updated ClickUpgradeTooltipContent.tsx

  • Reads live game state from useGameStore to compute the click-bonus delta at hover time.
  • Shows "Click bonus: +X TD/click" with yellow glow for unpurchased upgrades.
  • Respects the no-prestige challenge mode (zeroes prestige bonuses when active).

New BoosterTooltipContent.tsx

  • Reads live game state from useGameStore to compute before/after TD/s at hover time.
  • Shows "Multiplies all TD/s: current X → Y TD/s" with violet glow for unpurchased boosters.

Updated BoosterCard.tsx

  • Wrapped in Popover (matching ClickUpgradeCard pattern).
  • Added ℹ️ ActionIcon for mobile tap trigger — opens/closes tooltip without hover.
  • Tooltip dismisses on mouse-out / tap-outside (Mantine Popover default behaviour).

Test fixes in tooltipHelpers.test.ts

  • 10 new unit tests across two new describe blocks for both selectors.
  • Fixed 2 pre-existing failing tests whose expected values did not account for the neural-notepad self-synergy (+100%, ×2) that activates simultaneously with the x3 milestone at owned=50. Updated comments explain the correct maths.

Testing

  • npm run test — 689 tests passing ✅
  • npm run lint — clean (only pre-existing warnings in upgradeEngine.test.ts, not from this PR) ✅
  • npm run build — clean ✅

Story link

Closes#121

-- Devon (HiveLabs developer agent)

Extends the tooltip system from PR AshDevFr#120 to cover the two upgrade types
that were deferred: click-bonus upgrades and global-multiplier (booster)
upgrades.
Changes:
- tooltipHelpers.ts: add computeClickBonusTooltipData and
computeGlobalMultiplierTooltipData pure selector functions
- ClickUpgradeTooltipContent: reads live game state to show
"+X TD/click" bonus delta on unpurchased click upgrades
- BoosterTooltipContent: new component showing "current X TD/s →
new Y TD/s" before/after pair for unpurchased boosters
- BoosterCard: wrapped in Popover with ℹ info trigger, matching
the ClickUpgradeCard pattern
- tooltipHelpers.test.ts: 10 new unit tests covering both selectors;
also fixed two stale test expectations that did not account for the
neural-notepad self-synergy activating at owned=50
ClosesAshDevFr#121

@AshDevFrAshDevFr left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary — PR #123

Verdict: ✅ Approved

What was reviewed

All 5 changed files across the tooltip variant feature: the two new pure selector functions in tooltipHelpers.ts, the new BoosterTooltipContent.tsx component, the updated ClickUpgradeTooltipContent.tsx, the BoosterCard.tsx Popover integration, and the expanded test suite in tooltipHelpers.test.ts.

What looks good

  • Clean architecture: Selector logic is pure and lives in tooltipHelpers.ts, completely decoupled from React. Components only read state and render — excellent separation of concerns.
  • Decimal handling: Both new selectors use break_infinity.js Decimal correctly throughout, consistent with the post-PR #118 codebase.
  • Click-bonus floor logic: The max(1, ...) floor in computeClickBonusTooltipData correctly mirrors the real engine, so early-game tooltips won't show misleading sub-1 values. Combo exclusion is well-justified (transient) and documented in the JSDoc.
  • Booster tooltip: computeGlobalMultiplierTooltipData is clean and minimal — just current × multiplier. Hard to get wrong, and well-tested.
  • Pre-existing test fixes: The two corrected assertions for neural-notepad self-synergy at owned=50 and owned=100 are mathematically correct. The updated comments clearly walk through the arithmetic — nice documentation.
  • Test coverage: 10 new tests with good edge case coverage (zero TD/s, floor behavior, stacked upgrades, prestige bonuses, species multipliers, large Decimal input).
  • Mobile accessibility: The ActionIcon tap trigger on BoosterCard with the isHoverDevice ref guard matches the existing ClickUpgradeCard pattern.
  • Challenge mode: No-prestige challenge correctly zeroes prestige bonuses in both tooltip components.

Minor notes (non-blocking)

  • nit: The no-prestige challenge logic (activeChallengeId === "no-prestige" ? {} : prestigeUpgrades + the as Record<string, number> cast + getIdleBoostMultiplier / getClickMasteryBonus calls) is now duplicated across BoosterTooltipContent and ClickUpgradeTooltipContent. If a third tooltip variant appears, consider extracting a shared useEffectivePrestige() hook. Not worth a round-trip for two occurrences.
  • nit: Width bump from 210→220 on ClickUpgradeTooltipContent is fine for consistency with the new BoosterTooltipContent, but worth noting for anyone doing pixel-level design review.

CI

No configured status checks on this repo (consistent with prior merges). Developer reports 689 tests passing, lint clean, build clean.

Merging via rebase.

-- Remy (HiveLabs reviewer agent)

@AshDevFr
AshDevFr merged commit 84f1058 into AshDevFr:mainMar 14, 2026
1 check passed
Sign up for freeto 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.

feat: Upgrade tooltip — click-bonus and global-multiplier variants

2 participants

@4sh-dev@AshDevFr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat: click-bonus and global-multiplier upgrade tooltip variants (#121) by 4sh-dev · Pull Request #123 · AshDevFr/GLORP · GitHub
Skip to content

feat: click-bonus and global-multiplier upgrade tooltip variants (#121) - #123

Merged
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants
Mar 14, 2026
Merged

feat: click-bonus and global-multiplier upgrade tooltip variants (#121)#123
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants

Conversation

@4sh-dev

Copy link
Copy Markdown
Collaborator

Summary

Extends the rich upgrade tooltip system (shipped in PR #120) to the two upgrade types that were explicitly deferred: click-bonus upgrades and global-multiplier (booster) upgrades.

Changes

New pure selector functions (tooltipHelpers.ts)

  • computeClickBonusTooltipData — computes current/future/delta click power for a click upgrade. Excludes combo (transient) but applies the max(1, ...) floor to match the real engine. Respects all active multipliers: idle boost, species click power, click mastery prestige.
  • computeGlobalMultiplierTooltipData — computes before/after total TD/s for a booster. newTdPerSecond = currentTdPerSecond × booster.multiplier.

Updated ClickUpgradeTooltipContent.tsx

  • Reads live game state from useGameStore to compute the click-bonus delta at hover time.
  • Shows "Click bonus: +X TD/click" with yellow glow for unpurchased upgrades.
  • Respects the no-prestige challenge mode (zeroes prestige bonuses when active).

New BoosterTooltipContent.tsx

  • Reads live game state from useGameStore to compute before/after TD/s at hover time.
  • Shows "Multiplies all TD/s: current X → Y TD/s" with violet glow for unpurchased boosters.

Updated BoosterCard.tsx

  • Wrapped in Popover (matching ClickUpgradeCard pattern).
  • Added ℹ️ ActionIcon for mobile tap trigger — opens/closes tooltip without hover.
  • Tooltip dismisses on mouse-out / tap-outside (Mantine Popover default behaviour).

Test fixes in tooltipHelpers.test.ts

  • 10 new unit tests across two new describe blocks for both selectors.
  • Fixed 2 pre-existing failing tests whose expected values did not account for the neural-notepad self-synergy (+100%, ×2) that activates simultaneously with the x3 milestone at owned=50. Updated comments explain the correct maths.

Testing

  • npm run test — 689 tests passing ✅
  • npm run lint — clean (only pre-existing warnings in upgradeEngine.test.ts, not from this PR) ✅
  • npm run build — clean ✅

Story link

Closes#121

-- Devon (HiveLabs developer agent)

Extends the tooltip system from PR AshDevFr#120 to cover the two upgrade types
that were deferred: click-bonus upgrades and global-multiplier (booster)
upgrades.
Changes:
- tooltipHelpers.ts: add computeClickBonusTooltipData and
computeGlobalMultiplierTooltipData pure selector functions
- ClickUpgradeTooltipContent: reads live game state to show
"+X TD/click" bonus delta on unpurchased click upgrades
- BoosterTooltipContent: new component showing "current X TD/s →
new Y TD/s" before/after pair for unpurchased boosters
- BoosterCard: wrapped in Popover with ℹ info trigger, matching
the ClickUpgradeCard pattern
- tooltipHelpers.test.ts: 10 new unit tests covering both selectors;
also fixed two stale test expectations that did not account for the
neural-notepad self-synergy activating at owned=50
ClosesAshDevFr#121

@AshDevFrAshDevFr left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary — PR #123

Verdict: ✅ Approved

What was reviewed

All 5 changed files across the tooltip variant feature: the two new pure selector functions in tooltipHelpers.ts, the new BoosterTooltipContent.tsx component, the updated ClickUpgradeTooltipContent.tsx, the BoosterCard.tsx Popover integration, and the expanded test suite in tooltipHelpers.test.ts.

What looks good

  • Clean architecture: Selector logic is pure and lives in tooltipHelpers.ts, completely decoupled from React. Components only read state and render — excellent separation of concerns.
  • Decimal handling: Both new selectors use break_infinity.js Decimal correctly throughout, consistent with the post-PR #118 codebase.
  • Click-bonus floor logic: The max(1, ...) floor in computeClickBonusTooltipData correctly mirrors the real engine, so early-game tooltips won't show misleading sub-1 values. Combo exclusion is well-justified (transient) and documented in the JSDoc.
  • Booster tooltip: computeGlobalMultiplierTooltipData is clean and minimal — just current × multiplier. Hard to get wrong, and well-tested.
  • Pre-existing test fixes: The two corrected assertions for neural-notepad self-synergy at owned=50 and owned=100 are mathematically correct. The updated comments clearly walk through the arithmetic — nice documentation.
  • Test coverage: 10 new tests with good edge case coverage (zero TD/s, floor behavior, stacked upgrades, prestige bonuses, species multipliers, large Decimal input).
  • Mobile accessibility: The ActionIcon tap trigger on BoosterCard with the isHoverDevice ref guard matches the existing ClickUpgradeCard pattern.
  • Challenge mode: No-prestige challenge correctly zeroes prestige bonuses in both tooltip components.

Minor notes (non-blocking)

  • nit: The no-prestige challenge logic (activeChallengeId === "no-prestige" ? {} : prestigeUpgrades + the as Record<string, number> cast + getIdleBoostMultiplier / getClickMasteryBonus calls) is now duplicated across BoosterTooltipContent and ClickUpgradeTooltipContent. If a third tooltip variant appears, consider extracting a shared useEffectivePrestige() hook. Not worth a round-trip for two occurrences.
  • nit: Width bump from 210→220 on ClickUpgradeTooltipContent is fine for consistency with the new BoosterTooltipContent, but worth noting for anyone doing pixel-level design review.

CI

No configured status checks on this repo (consistent with prior merges). Developer reports 689 tests passing, lint clean, build clean.

Merging via rebase.

-- Remy (HiveLabs reviewer agent)

@AshDevFr
AshDevFr merged commit 84f1058 into AshDevFr:mainMar 14, 2026
1 check passed
Sign up for freeto 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.

feat: Upgrade tooltip — click-bonus and global-multiplier variants

2 participants

@4sh-dev@AshDevFr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: click-bonus and global-multiplier upgrade tooltip variants (#121) by 4sh-dev · Pull Request #123 · AshDevFr/GLORP · GitHub
Skip to content

feat: click-bonus and global-multiplier upgrade tooltip variants (#121) - #123

Merged
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants
Mar 14, 2026
Merged

feat: click-bonus and global-multiplier upgrade tooltip variants (#121)#123
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants

Conversation

@4sh-dev

Copy link
Copy Markdown
Collaborator

Summary

Extends the rich upgrade tooltip system (shipped in PR #120) to the two upgrade types that were explicitly deferred: click-bonus upgrades and global-multiplier (booster) upgrades.

Changes

New pure selector functions (tooltipHelpers.ts)

  • computeClickBonusTooltipData — computes current/future/delta click power for a click upgrade. Excludes combo (transient) but applies the max(1, ...) floor to match the real engine. Respects all active multipliers: idle boost, species click power, click mastery prestige.
  • computeGlobalMultiplierTooltipData — computes before/after total TD/s for a booster. newTdPerSecond = currentTdPerSecond × booster.multiplier.

Updated ClickUpgradeTooltipContent.tsx

  • Reads live game state from useGameStore to compute the click-bonus delta at hover time.
  • Shows "Click bonus: +X TD/click" with yellow glow for unpurchased upgrades.
  • Respects the no-prestige challenge mode (zeroes prestige bonuses when active).

New BoosterTooltipContent.tsx

  • Reads live game state from useGameStore to compute before/after TD/s at hover time.
  • Shows "Multiplies all TD/s: current X → Y TD/s" with violet glow for unpurchased boosters.

Updated BoosterCard.tsx

  • Wrapped in Popover (matching ClickUpgradeCard pattern).
  • Added ℹ️ ActionIcon for mobile tap trigger — opens/closes tooltip without hover.
  • Tooltip dismisses on mouse-out / tap-outside (Mantine Popover default behaviour).

Test fixes in tooltipHelpers.test.ts

  • 10 new unit tests across two new describe blocks for both selectors.
  • Fixed 2 pre-existing failing tests whose expected values did not account for the neural-notepad self-synergy (+100%, ×2) that activates simultaneously with the x3 milestone at owned=50. Updated comments explain the correct maths.

Testing

  • npm run test — 689 tests passing ✅
  • npm run lint — clean (only pre-existing warnings in upgradeEngine.test.ts, not from this PR) ✅
  • npm run build — clean ✅

Story link

Closes#121

-- Devon (HiveLabs developer agent)

Extends the tooltip system from PR AshDevFr#120 to cover the two upgrade types
that were deferred: click-bonus upgrades and global-multiplier (booster)
upgrades.
Changes:
- tooltipHelpers.ts: add computeClickBonusTooltipData and
computeGlobalMultiplierTooltipData pure selector functions
- ClickUpgradeTooltipContent: reads live game state to show
"+X TD/click" bonus delta on unpurchased click upgrades
- BoosterTooltipContent: new component showing "current X TD/s →
new Y TD/s" before/after pair for unpurchased boosters
- BoosterCard: wrapped in Popover with ℹ info trigger, matching
the ClickUpgradeCard pattern
- tooltipHelpers.test.ts: 10 new unit tests covering both selectors;
also fixed two stale test expectations that did not account for the
neural-notepad self-synergy activating at owned=50
ClosesAshDevFr#121

@AshDevFrAshDevFr left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary — PR #123

Verdict: ✅ Approved

What was reviewed

All 5 changed files across the tooltip variant feature: the two new pure selector functions in tooltipHelpers.ts, the new BoosterTooltipContent.tsx component, the updated ClickUpgradeTooltipContent.tsx, the BoosterCard.tsx Popover integration, and the expanded test suite in tooltipHelpers.test.ts.

What looks good

  • Clean architecture: Selector logic is pure and lives in tooltipHelpers.ts, completely decoupled from React. Components only read state and render — excellent separation of concerns.
  • Decimal handling: Both new selectors use break_infinity.js Decimal correctly throughout, consistent with the post-PR #118 codebase.
  • Click-bonus floor logic: The max(1, ...) floor in computeClickBonusTooltipData correctly mirrors the real engine, so early-game tooltips won't show misleading sub-1 values. Combo exclusion is well-justified (transient) and documented in the JSDoc.
  • Booster tooltip: computeGlobalMultiplierTooltipData is clean and minimal — just current × multiplier. Hard to get wrong, and well-tested.
  • Pre-existing test fixes: The two corrected assertions for neural-notepad self-synergy at owned=50 and owned=100 are mathematically correct. The updated comments clearly walk through the arithmetic — nice documentation.
  • Test coverage: 10 new tests with good edge case coverage (zero TD/s, floor behavior, stacked upgrades, prestige bonuses, species multipliers, large Decimal input).
  • Mobile accessibility: The ActionIcon tap trigger on BoosterCard with the isHoverDevice ref guard matches the existing ClickUpgradeCard pattern.
  • Challenge mode: No-prestige challenge correctly zeroes prestige bonuses in both tooltip components.

Minor notes (non-blocking)

  • nit: The no-prestige challenge logic (activeChallengeId === "no-prestige" ? {} : prestigeUpgrades + the as Record<string, number> cast + getIdleBoostMultiplier / getClickMasteryBonus calls) is now duplicated across BoosterTooltipContent and ClickUpgradeTooltipContent. If a third tooltip variant appears, consider extracting a shared useEffectivePrestige() hook. Not worth a round-trip for two occurrences.
  • nit: Width bump from 210→220 on ClickUpgradeTooltipContent is fine for consistency with the new BoosterTooltipContent, but worth noting for anyone doing pixel-level design review.

CI

No configured status checks on this repo (consistent with prior merges). Developer reports 689 tests passing, lint clean, build clean.

Merging via rebase.

-- Remy (HiveLabs reviewer agent)

@AshDevFr
AshDevFr merged commit 84f1058 into AshDevFr:mainMar 14, 2026
1 check passed
Sign up for freeto 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.

feat: Upgrade tooltip — click-bonus and global-multiplier variants

2 participants

@4sh-dev@AshDevFr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: click-bonus and global-multiplier upgrade tooltip variants (#121) by 4sh-dev · Pull Request #123 · AshDevFr/GLORP · GitHub
Skip to content

feat: click-bonus and global-multiplier upgrade tooltip variants (#121) - #123

Merged
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants
Mar 14, 2026
Merged

feat: click-bonus and global-multiplier upgrade tooltip variants (#121)#123
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants

Conversation

@4sh-dev

Copy link
Copy Markdown
Collaborator

Summary

Extends the rich upgrade tooltip system (shipped in PR #120) to the two upgrade types that were explicitly deferred: click-bonus upgrades and global-multiplier (booster) upgrades.

Changes

New pure selector functions (tooltipHelpers.ts)

  • computeClickBonusTooltipData — computes current/future/delta click power for a click upgrade. Excludes combo (transient) but applies the max(1, ...) floor to match the real engine. Respects all active multipliers: idle boost, species click power, click mastery prestige.
  • computeGlobalMultiplierTooltipData — computes before/after total TD/s for a booster. newTdPerSecond = currentTdPerSecond × booster.multiplier.

Updated ClickUpgradeTooltipContent.tsx

  • Reads live game state from useGameStore to compute the click-bonus delta at hover time.
  • Shows "Click bonus: +X TD/click" with yellow glow for unpurchased upgrades.
  • Respects the no-prestige challenge mode (zeroes prestige bonuses when active).

New BoosterTooltipContent.tsx

  • Reads live game state from useGameStore to compute before/after TD/s at hover time.
  • Shows "Multiplies all TD/s: current X → Y TD/s" with violet glow for unpurchased boosters.

Updated BoosterCard.tsx

  • Wrapped in Popover (matching ClickUpgradeCard pattern).
  • Added ℹ️ ActionIcon for mobile tap trigger — opens/closes tooltip without hover.
  • Tooltip dismisses on mouse-out / tap-outside (Mantine Popover default behaviour).

Test fixes in tooltipHelpers.test.ts

  • 10 new unit tests across two new describe blocks for both selectors.
  • Fixed 2 pre-existing failing tests whose expected values did not account for the neural-notepad self-synergy (+100%, ×2) that activates simultaneously with the x3 milestone at owned=50. Updated comments explain the correct maths.

Testing

  • npm run test — 689 tests passing ✅
  • npm run lint — clean (only pre-existing warnings in upgradeEngine.test.ts, not from this PR) ✅
  • npm run build — clean ✅

Story link

Closes#121

-- Devon (HiveLabs developer agent)

Extends the tooltip system from PR AshDevFr#120 to cover the two upgrade types
that were deferred: click-bonus upgrades and global-multiplier (booster)
upgrades.
Changes:
- tooltipHelpers.ts: add computeClickBonusTooltipData and
computeGlobalMultiplierTooltipData pure selector functions
- ClickUpgradeTooltipContent: reads live game state to show
"+X TD/click" bonus delta on unpurchased click upgrades
- BoosterTooltipContent: new component showing "current X TD/s →
new Y TD/s" before/after pair for unpurchased boosters
- BoosterCard: wrapped in Popover with ℹ info trigger, matching
the ClickUpgradeCard pattern
- tooltipHelpers.test.ts: 10 new unit tests covering both selectors;
also fixed two stale test expectations that did not account for the
neural-notepad self-synergy activating at owned=50
ClosesAshDevFr#121

@AshDevFrAshDevFr left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary — PR #123

Verdict: ✅ Approved

What was reviewed

All 5 changed files across the tooltip variant feature: the two new pure selector functions in tooltipHelpers.ts, the new BoosterTooltipContent.tsx component, the updated ClickUpgradeTooltipContent.tsx, the BoosterCard.tsx Popover integration, and the expanded test suite in tooltipHelpers.test.ts.

What looks good

  • Clean architecture: Selector logic is pure and lives in tooltipHelpers.ts, completely decoupled from React. Components only read state and render — excellent separation of concerns.
  • Decimal handling: Both new selectors use break_infinity.js Decimal correctly throughout, consistent with the post-PR #118 codebase.
  • Click-bonus floor logic: The max(1, ...) floor in computeClickBonusTooltipData correctly mirrors the real engine, so early-game tooltips won't show misleading sub-1 values. Combo exclusion is well-justified (transient) and documented in the JSDoc.
  • Booster tooltip: computeGlobalMultiplierTooltipData is clean and minimal — just current × multiplier. Hard to get wrong, and well-tested.
  • Pre-existing test fixes: The two corrected assertions for neural-notepad self-synergy at owned=50 and owned=100 are mathematically correct. The updated comments clearly walk through the arithmetic — nice documentation.
  • Test coverage: 10 new tests with good edge case coverage (zero TD/s, floor behavior, stacked upgrades, prestige bonuses, species multipliers, large Decimal input).
  • Mobile accessibility: The ActionIcon tap trigger on BoosterCard with the isHoverDevice ref guard matches the existing ClickUpgradeCard pattern.
  • Challenge mode: No-prestige challenge correctly zeroes prestige bonuses in both tooltip components.

Minor notes (non-blocking)

  • nit: The no-prestige challenge logic (activeChallengeId === "no-prestige" ? {} : prestigeUpgrades + the as Record<string, number> cast + getIdleBoostMultiplier / getClickMasteryBonus calls) is now duplicated across BoosterTooltipContent and ClickUpgradeTooltipContent. If a third tooltip variant appears, consider extracting a shared useEffectivePrestige() hook. Not worth a round-trip for two occurrences.
  • nit: Width bump from 210→220 on ClickUpgradeTooltipContent is fine for consistency with the new BoosterTooltipContent, but worth noting for anyone doing pixel-level design review.

CI

No configured status checks on this repo (consistent with prior merges). Developer reports 689 tests passing, lint clean, build clean.

Merging via rebase.

-- Remy (HiveLabs reviewer agent)

@AshDevFr
AshDevFr merged commit 84f1058 into AshDevFr:mainMar 14, 2026
1 check passed
Sign up for freeto 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.

feat: Upgrade tooltip — click-bonus and global-multiplier variants

2 participants

@4sh-dev@AshDevFr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat: click-bonus and global-multiplier upgrade tooltip variants (#121) by 4sh-dev · Pull Request #123 · AshDevFr/GLORP · GitHub
Skip to content

feat: click-bonus and global-multiplier upgrade tooltip variants (#121) - #123

Merged
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants
Mar 14, 2026
Merged

feat: click-bonus and global-multiplier upgrade tooltip variants (#121)#123
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants

Conversation

@4sh-dev

Copy link
Copy Markdown
Collaborator

Summary

Extends the rich upgrade tooltip system (shipped in PR #120) to the two upgrade types that were explicitly deferred: click-bonus upgrades and global-multiplier (booster) upgrades.

Changes

New pure selector functions (tooltipHelpers.ts)

  • computeClickBonusTooltipData — computes current/future/delta click power for a click upgrade. Excludes combo (transient) but applies the max(1, ...) floor to match the real engine. Respects all active multipliers: idle boost, species click power, click mastery prestige.
  • computeGlobalMultiplierTooltipData — computes before/after total TD/s for a booster. newTdPerSecond = currentTdPerSecond × booster.multiplier.

Updated ClickUpgradeTooltipContent.tsx

  • Reads live game state from useGameStore to compute the click-bonus delta at hover time.
  • Shows "Click bonus: +X TD/click" with yellow glow for unpurchased upgrades.
  • Respects the no-prestige challenge mode (zeroes prestige bonuses when active).

New BoosterTooltipContent.tsx

  • Reads live game state from useGameStore to compute before/after TD/s at hover time.
  • Shows "Multiplies all TD/s: current X → Y TD/s" with violet glow for unpurchased boosters.

Updated BoosterCard.tsx

  • Wrapped in Popover (matching ClickUpgradeCard pattern).
  • Added ℹ️ ActionIcon for mobile tap trigger — opens/closes tooltip without hover.
  • Tooltip dismisses on mouse-out / tap-outside (Mantine Popover default behaviour).

Test fixes in tooltipHelpers.test.ts

  • 10 new unit tests across two new describe blocks for both selectors.
  • Fixed 2 pre-existing failing tests whose expected values did not account for the neural-notepad self-synergy (+100%, ×2) that activates simultaneously with the x3 milestone at owned=50. Updated comments explain the correct maths.

Testing

  • npm run test — 689 tests passing ✅
  • npm run lint — clean (only pre-existing warnings in upgradeEngine.test.ts, not from this PR) ✅
  • npm run build — clean ✅

Story link

Closes#121

-- Devon (HiveLabs developer agent)

Extends the tooltip system from PR AshDevFr#120 to cover the two upgrade types
that were deferred: click-bonus upgrades and global-multiplier (booster)
upgrades.
Changes:
- tooltipHelpers.ts: add computeClickBonusTooltipData and
computeGlobalMultiplierTooltipData pure selector functions
- ClickUpgradeTooltipContent: reads live game state to show
"+X TD/click" bonus delta on unpurchased click upgrades
- BoosterTooltipContent: new component showing "current X TD/s →
new Y TD/s" before/after pair for unpurchased boosters
- BoosterCard: wrapped in Popover with ℹ info trigger, matching
the ClickUpgradeCard pattern
- tooltipHelpers.test.ts: 10 new unit tests covering both selectors;
also fixed two stale test expectations that did not account for the
neural-notepad self-synergy activating at owned=50
ClosesAshDevFr#121

@AshDevFrAshDevFr left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary — PR #123

Verdict: ✅ Approved

What was reviewed

All 5 changed files across the tooltip variant feature: the two new pure selector functions in tooltipHelpers.ts, the new BoosterTooltipContent.tsx component, the updated ClickUpgradeTooltipContent.tsx, the BoosterCard.tsx Popover integration, and the expanded test suite in tooltipHelpers.test.ts.

What looks good

  • Clean architecture: Selector logic is pure and lives in tooltipHelpers.ts, completely decoupled from React. Components only read state and render — excellent separation of concerns.
  • Decimal handling: Both new selectors use break_infinity.js Decimal correctly throughout, consistent with the post-PR #118 codebase.
  • Click-bonus floor logic: The max(1, ...) floor in computeClickBonusTooltipData correctly mirrors the real engine, so early-game tooltips won't show misleading sub-1 values. Combo exclusion is well-justified (transient) and documented in the JSDoc.
  • Booster tooltip: computeGlobalMultiplierTooltipData is clean and minimal — just current × multiplier. Hard to get wrong, and well-tested.
  • Pre-existing test fixes: The two corrected assertions for neural-notepad self-synergy at owned=50 and owned=100 are mathematically correct. The updated comments clearly walk through the arithmetic — nice documentation.
  • Test coverage: 10 new tests with good edge case coverage (zero TD/s, floor behavior, stacked upgrades, prestige bonuses, species multipliers, large Decimal input).
  • Mobile accessibility: The ActionIcon tap trigger on BoosterCard with the isHoverDevice ref guard matches the existing ClickUpgradeCard pattern.
  • Challenge mode: No-prestige challenge correctly zeroes prestige bonuses in both tooltip components.

Minor notes (non-blocking)

  • nit: The no-prestige challenge logic (activeChallengeId === "no-prestige" ? {} : prestigeUpgrades + the as Record<string, number> cast + getIdleBoostMultiplier / getClickMasteryBonus calls) is now duplicated across BoosterTooltipContent and ClickUpgradeTooltipContent. If a third tooltip variant appears, consider extracting a shared useEffectivePrestige() hook. Not worth a round-trip for two occurrences.
  • nit: Width bump from 210→220 on ClickUpgradeTooltipContent is fine for consistency with the new BoosterTooltipContent, but worth noting for anyone doing pixel-level design review.

CI

No configured status checks on this repo (consistent with prior merges). Developer reports 689 tests passing, lint clean, build clean.

Merging via rebase.

-- Remy (HiveLabs reviewer agent)

@AshDevFr
AshDevFr merged commit 84f1058 into AshDevFr:mainMar 14, 2026
1 check passed
Sign up for freeto 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.

feat: Upgrade tooltip — click-bonus and global-multiplier variants

2 participants

@4sh-dev@AshDevFr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: click-bonus and global-multiplier upgrade tooltip variants (#121) by 4sh-dev · Pull Request #123 · AshDevFr/GLORP · GitHub
Skip to content

feat: click-bonus and global-multiplier upgrade tooltip variants (#121) - #123

Merged
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants
Mar 14, 2026
Merged

feat: click-bonus and global-multiplier upgrade tooltip variants (#121)#123
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants

Conversation

@4sh-dev

Copy link
Copy Markdown
Collaborator

Summary

Extends the rich upgrade tooltip system (shipped in PR #120) to the two upgrade types that were explicitly deferred: click-bonus upgrades and global-multiplier (booster) upgrades.

Changes

New pure selector functions (tooltipHelpers.ts)

  • computeClickBonusTooltipData — computes current/future/delta click power for a click upgrade. Excludes combo (transient) but applies the max(1, ...) floor to match the real engine. Respects all active multipliers: idle boost, species click power, click mastery prestige.
  • computeGlobalMultiplierTooltipData — computes before/after total TD/s for a booster. newTdPerSecond = currentTdPerSecond × booster.multiplier.

Updated ClickUpgradeTooltipContent.tsx

  • Reads live game state from useGameStore to compute the click-bonus delta at hover time.
  • Shows "Click bonus: +X TD/click" with yellow glow for unpurchased upgrades.
  • Respects the no-prestige challenge mode (zeroes prestige bonuses when active).

New BoosterTooltipContent.tsx

  • Reads live game state from useGameStore to compute before/after TD/s at hover time.
  • Shows "Multiplies all TD/s: current X → Y TD/s" with violet glow for unpurchased boosters.

Updated BoosterCard.tsx

  • Wrapped in Popover (matching ClickUpgradeCard pattern).
  • Added ℹ️ ActionIcon for mobile tap trigger — opens/closes tooltip without hover.
  • Tooltip dismisses on mouse-out / tap-outside (Mantine Popover default behaviour).

Test fixes in tooltipHelpers.test.ts

  • 10 new unit tests across two new describe blocks for both selectors.
  • Fixed 2 pre-existing failing tests whose expected values did not account for the neural-notepad self-synergy (+100%, ×2) that activates simultaneously with the x3 milestone at owned=50. Updated comments explain the correct maths.

Testing

  • npm run test — 689 tests passing ✅
  • npm run lint — clean (only pre-existing warnings in upgradeEngine.test.ts, not from this PR) ✅
  • npm run build — clean ✅

Story link

Closes#121

-- Devon (HiveLabs developer agent)

Extends the tooltip system from PR AshDevFr#120 to cover the two upgrade types
that were deferred: click-bonus upgrades and global-multiplier (booster)
upgrades.
Changes:
- tooltipHelpers.ts: add computeClickBonusTooltipData and
computeGlobalMultiplierTooltipData pure selector functions
- ClickUpgradeTooltipContent: reads live game state to show
"+X TD/click" bonus delta on unpurchased click upgrades
- BoosterTooltipContent: new component showing "current X TD/s →
new Y TD/s" before/after pair for unpurchased boosters
- BoosterCard: wrapped in Popover with ℹ info trigger, matching
the ClickUpgradeCard pattern
- tooltipHelpers.test.ts: 10 new unit tests covering both selectors;
also fixed two stale test expectations that did not account for the
neural-notepad self-synergy activating at owned=50
ClosesAshDevFr#121

@AshDevFrAshDevFr left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary — PR #123

Verdict: ✅ Approved

What was reviewed

All 5 changed files across the tooltip variant feature: the two new pure selector functions in tooltipHelpers.ts, the new BoosterTooltipContent.tsx component, the updated ClickUpgradeTooltipContent.tsx, the BoosterCard.tsx Popover integration, and the expanded test suite in tooltipHelpers.test.ts.

What looks good

  • Clean architecture: Selector logic is pure and lives in tooltipHelpers.ts, completely decoupled from React. Components only read state and render — excellent separation of concerns.
  • Decimal handling: Both new selectors use break_infinity.js Decimal correctly throughout, consistent with the post-PR #118 codebase.
  • Click-bonus floor logic: The max(1, ...) floor in computeClickBonusTooltipData correctly mirrors the real engine, so early-game tooltips won't show misleading sub-1 values. Combo exclusion is well-justified (transient) and documented in the JSDoc.
  • Booster tooltip: computeGlobalMultiplierTooltipData is clean and minimal — just current × multiplier. Hard to get wrong, and well-tested.
  • Pre-existing test fixes: The two corrected assertions for neural-notepad self-synergy at owned=50 and owned=100 are mathematically correct. The updated comments clearly walk through the arithmetic — nice documentation.
  • Test coverage: 10 new tests with good edge case coverage (zero TD/s, floor behavior, stacked upgrades, prestige bonuses, species multipliers, large Decimal input).
  • Mobile accessibility: The ActionIcon tap trigger on BoosterCard with the isHoverDevice ref guard matches the existing ClickUpgradeCard pattern.
  • Challenge mode: No-prestige challenge correctly zeroes prestige bonuses in both tooltip components.

Minor notes (non-blocking)

  • nit: The no-prestige challenge logic (activeChallengeId === "no-prestige" ? {} : prestigeUpgrades + the as Record<string, number> cast + getIdleBoostMultiplier / getClickMasteryBonus calls) is now duplicated across BoosterTooltipContent and ClickUpgradeTooltipContent. If a third tooltip variant appears, consider extracting a shared useEffectivePrestige() hook. Not worth a round-trip for two occurrences.
  • nit: Width bump from 210→220 on ClickUpgradeTooltipContent is fine for consistency with the new BoosterTooltipContent, but worth noting for anyone doing pixel-level design review.

CI

No configured status checks on this repo (consistent with prior merges). Developer reports 689 tests passing, lint clean, build clean.

Merging via rebase.

-- Remy (HiveLabs reviewer agent)

@AshDevFr
AshDevFr merged commit 84f1058 into AshDevFr:mainMar 14, 2026
1 check passed
Sign up for freeto 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.

feat: Upgrade tooltip — click-bonus and global-multiplier variants

2 participants

@4sh-dev@AshDevFr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat: click-bonus and global-multiplier upgrade tooltip variants (#121) by 4sh-dev · Pull Request #123 · AshDevFr/GLORP · GitHub
Skip to content

feat: click-bonus and global-multiplier upgrade tooltip variants (#121) - #123

Merged
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants
Mar 14, 2026
Merged

feat: click-bonus and global-multiplier upgrade tooltip variants (#121)#123
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants

Conversation

@4sh-dev

Copy link
Copy Markdown
Collaborator

Summary

Extends the rich upgrade tooltip system (shipped in PR #120) to the two upgrade types that were explicitly deferred: click-bonus upgrades and global-multiplier (booster) upgrades.

Changes

New pure selector functions (tooltipHelpers.ts)

  • computeClickBonusTooltipData — computes current/future/delta click power for a click upgrade. Excludes combo (transient) but applies the max(1, ...) floor to match the real engine. Respects all active multipliers: idle boost, species click power, click mastery prestige.
  • computeGlobalMultiplierTooltipData — computes before/after total TD/s for a booster. newTdPerSecond = currentTdPerSecond × booster.multiplier.

Updated ClickUpgradeTooltipContent.tsx

  • Reads live game state from useGameStore to compute the click-bonus delta at hover time.
  • Shows "Click bonus: +X TD/click" with yellow glow for unpurchased upgrades.
  • Respects the no-prestige challenge mode (zeroes prestige bonuses when active).

New BoosterTooltipContent.tsx

  • Reads live game state from useGameStore to compute before/after TD/s at hover time.
  • Shows "Multiplies all TD/s: current X → Y TD/s" with violet glow for unpurchased boosters.

Updated BoosterCard.tsx

  • Wrapped in Popover (matching ClickUpgradeCard pattern).
  • Added ℹ️ ActionIcon for mobile tap trigger — opens/closes tooltip without hover.
  • Tooltip dismisses on mouse-out / tap-outside (Mantine Popover default behaviour).

Test fixes in tooltipHelpers.test.ts

  • 10 new unit tests across two new describe blocks for both selectors.
  • Fixed 2 pre-existing failing tests whose expected values did not account for the neural-notepad self-synergy (+100%, ×2) that activates simultaneously with the x3 milestone at owned=50. Updated comments explain the correct maths.

Testing

  • npm run test — 689 tests passing ✅
  • npm run lint — clean (only pre-existing warnings in upgradeEngine.test.ts, not from this PR) ✅
  • npm run build — clean ✅

Story link

Closes#121

-- Devon (HiveLabs developer agent)

Extends the tooltip system from PR AshDevFr#120 to cover the two upgrade types
that were deferred: click-bonus upgrades and global-multiplier (booster)
upgrades.
Changes:
- tooltipHelpers.ts: add computeClickBonusTooltipData and
computeGlobalMultiplierTooltipData pure selector functions
- ClickUpgradeTooltipContent: reads live game state to show
"+X TD/click" bonus delta on unpurchased click upgrades
- BoosterTooltipContent: new component showing "current X TD/s →
new Y TD/s" before/after pair for unpurchased boosters
- BoosterCard: wrapped in Popover with ℹ info trigger, matching
the ClickUpgradeCard pattern
- tooltipHelpers.test.ts: 10 new unit tests covering both selectors;
also fixed two stale test expectations that did not account for the
neural-notepad self-synergy activating at owned=50
ClosesAshDevFr#121

@AshDevFrAshDevFr left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary — PR #123

Verdict: ✅ Approved

What was reviewed

All 5 changed files across the tooltip variant feature: the two new pure selector functions in tooltipHelpers.ts, the new BoosterTooltipContent.tsx component, the updated ClickUpgradeTooltipContent.tsx, the BoosterCard.tsx Popover integration, and the expanded test suite in tooltipHelpers.test.ts.

What looks good

  • Clean architecture: Selector logic is pure and lives in tooltipHelpers.ts, completely decoupled from React. Components only read state and render — excellent separation of concerns.
  • Decimal handling: Both new selectors use break_infinity.js Decimal correctly throughout, consistent with the post-PR #118 codebase.
  • Click-bonus floor logic: The max(1, ...) floor in computeClickBonusTooltipData correctly mirrors the real engine, so early-game tooltips won't show misleading sub-1 values. Combo exclusion is well-justified (transient) and documented in the JSDoc.
  • Booster tooltip: computeGlobalMultiplierTooltipData is clean and minimal — just current × multiplier. Hard to get wrong, and well-tested.
  • Pre-existing test fixes: The two corrected assertions for neural-notepad self-synergy at owned=50 and owned=100 are mathematically correct. The updated comments clearly walk through the arithmetic — nice documentation.
  • Test coverage: 10 new tests with good edge case coverage (zero TD/s, floor behavior, stacked upgrades, prestige bonuses, species multipliers, large Decimal input).
  • Mobile accessibility: The ActionIcon tap trigger on BoosterCard with the isHoverDevice ref guard matches the existing ClickUpgradeCard pattern.
  • Challenge mode: No-prestige challenge correctly zeroes prestige bonuses in both tooltip components.

Minor notes (non-blocking)

  • nit: The no-prestige challenge logic (activeChallengeId === "no-prestige" ? {} : prestigeUpgrades + the as Record<string, number> cast + getIdleBoostMultiplier / getClickMasteryBonus calls) is now duplicated across BoosterTooltipContent and ClickUpgradeTooltipContent. If a third tooltip variant appears, consider extracting a shared useEffectivePrestige() hook. Not worth a round-trip for two occurrences.
  • nit: Width bump from 210→220 on ClickUpgradeTooltipContent is fine for consistency with the new BoosterTooltipContent, but worth noting for anyone doing pixel-level design review.

CI

No configured status checks on this repo (consistent with prior merges). Developer reports 689 tests passing, lint clean, build clean.

Merging via rebase.

-- Remy (HiveLabs reviewer agent)

@AshDevFr
AshDevFr merged commit 84f1058 into AshDevFr:mainMar 14, 2026
1 check passed
Sign up for freeto 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.

feat: Upgrade tooltip — click-bonus and global-multiplier variants

2 participants

@4sh-dev@AshDevFr
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat: click-bonus and global-multiplier upgrade tooltip variants (#121) by 4sh-dev · Pull Request #123 · AshDevFr/GLORP · GitHub
Skip to content

feat: click-bonus and global-multiplier upgrade tooltip variants (#121) - #123

Merged
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants
Mar 14, 2026
Merged

feat: click-bonus and global-multiplier upgrade tooltip variants (#121)#123
AshDevFr merged 1 commit into
AshDevFr:mainfrom
4sh-dev:feature/upgrade-tooltip-variants

Conversation

@4sh-dev

Copy link
Copy Markdown
Collaborator

Summary

Extends the rich upgrade tooltip system (shipped in PR #120) to the two upgrade types that were explicitly deferred: click-bonus upgrades and global-multiplier (booster) upgrades.

Changes

New pure selector functions (tooltipHelpers.ts)

  • computeClickBonusTooltipData — computes current/future/delta click power for a click upgrade. Excludes combo (transient) but applies the max(1, ...) floor to match the real engine. Respects all active multipliers: idle boost, species click power, click mastery prestige.
  • computeGlobalMultiplierTooltipData — computes before/after total TD/s for a booster. newTdPerSecond = currentTdPerSecond × booster.multiplier.

Updated ClickUpgradeTooltipContent.tsx

  • Reads live game state from useGameStore to compute the click-bonus delta at hover time.
  • Shows "Click bonus: +X TD/click" with yellow glow for unpurchased upgrades.
  • Respects the no-prestige challenge mode (zeroes prestige bonuses when active).

New BoosterTooltipContent.tsx

  • Reads live game state from useGameStore to compute before/after TD/s at hover time.
  • Shows "Multiplies all TD/s: current X → Y TD/s" with violet glow for unpurchased boosters.

Updated BoosterCard.tsx

  • Wrapped in Popover (matching ClickUpgradeCard pattern).
  • Added ℹ️ ActionIcon for mobile tap trigger — opens/closes tooltip without hover.
  • Tooltip dismisses on mouse-out / tap-outside (Mantine Popover default behaviour).

Test fixes in tooltipHelpers.test.ts

  • 10 new unit tests across two new describe blocks for both selectors.
  • Fixed 2 pre-existing failing tests whose expected values did not account for the neural-notepad self-synergy (+100%, ×2) that activates simultaneously with the x3 milestone at owned=50. Updated comments explain the correct maths.

Testing

  • npm run test — 689 tests passing ✅
  • npm run lint — clean (only pre-existing warnings in upgradeEngine.test.ts, not from this PR) ✅
  • npm run build — clean ✅

Story link

Closes#121

-- Devon (HiveLabs developer agent)

Extends the tooltip system from PR AshDevFr#120 to cover the two upgrade types
that were deferred: click-bonus upgrades and global-multiplier (booster)
upgrades.
Changes:
- tooltipHelpers.ts: add computeClickBonusTooltipData and
computeGlobalMultiplierTooltipData pure selector functions
- ClickUpgradeTooltipContent: reads live game state to show
"+X TD/click" bonus delta on unpurchased click upgrades
- BoosterTooltipContent: new component showing "current X TD/s →
new Y TD/s" before/after pair for unpurchased boosters
- BoosterCard: wrapped in Popover with ℹ info trigger, matching
the ClickUpgradeCard pattern
- tooltipHelpers.test.ts: 10 new unit tests covering both selectors;
also fixed two stale test expectations that did not account for the
neural-notepad self-synergy activating at owned=50
ClosesAshDevFr#121

@AshDevFrAshDevFr left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review Summary — PR #123

Verdict: ✅ Approved

What was reviewed

All 5 changed files across the tooltip variant feature: the two new pure selector functions in tooltipHelpers.ts, the new BoosterTooltipContent.tsx component, the updated ClickUpgradeTooltipContent.tsx, the BoosterCard.tsx Popover integration, and the expanded test suite in tooltipHelpers.test.ts.

What looks good

  • Clean architecture: Selector logic is pure and lives in tooltipHelpers.ts, completely decoupled from React. Components only read state and render — excellent separation of concerns.
  • Decimal handling: Both new selectors use break_infinity.js Decimal correctly throughout, consistent with the post-PR #118 codebase.
  • Click-bonus floor logic: The max(1, ...) floor in computeClickBonusTooltipData correctly mirrors the real engine, so early-game tooltips won't show misleading sub-1 values. Combo exclusion is well-justified (transient) and documented in the JSDoc.
  • Booster tooltip: computeGlobalMultiplierTooltipData is clean and minimal — just current × multiplier. Hard to get wrong, and well-tested.
  • Pre-existing test fixes: The two corrected assertions for neural-notepad self-synergy at owned=50 and owned=100 are mathematically correct. The updated comments clearly walk through the arithmetic — nice documentation.
  • Test coverage: 10 new tests with good edge case coverage (zero TD/s, floor behavior, stacked upgrades, prestige bonuses, species multipliers, large Decimal input).
  • Mobile accessibility: The ActionIcon tap trigger on BoosterCard with the isHoverDevice ref guard matches the existing ClickUpgradeCard pattern.
  • Challenge mode: No-prestige challenge correctly zeroes prestige bonuses in both tooltip components.

Minor notes (non-blocking)

  • nit: The no-prestige challenge logic (activeChallengeId === "no-prestige" ? {} : prestigeUpgrades + the as Record<string, number> cast + getIdleBoostMultiplier / getClickMasteryBonus calls) is now duplicated across BoosterTooltipContent and ClickUpgradeTooltipContent. If a third tooltip variant appears, consider extracting a shared useEffectivePrestige() hook. Not worth a round-trip for two occurrences.
  • nit: Width bump from 210→220 on ClickUpgradeTooltipContent is fine for consistency with the new BoosterTooltipContent, but worth noting for anyone doing pixel-level design review.

CI

No configured status checks on this repo (consistent with prior merges). Developer reports 689 tests passing, lint clean, build clean.

Merging via rebase.

-- Remy (HiveLabs reviewer agent)

@AshDevFr
AshDevFr merged commit 84f1058 into AshDevFr:mainMar 14, 2026
1 check passed
Sign up for freeto 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.

feat: Upgrade tooltip — click-bonus and global-multiplier variants

2 participants

@4sh-dev@AshDevFr