Improve desktop update button with status-based visuals - #1427

Closed
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux
Closed

Improve desktop update button with status-based visuals#1427
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux

Conversation

@zycck

@zycckzycck commented Mar 26, 2026

Copy link
Copy Markdown

What Changed

Replace the generic dot indicator on the desktop update button with a color-coded rocket icon that reflects update state:

  • Available — amber pulsing rocket, prompts download
  • Downloading — sky-blue rocket with real-time SVG fill showing download progress
  • Downloaded — emerald pulsing rocket, prompts install
  • Error — rose pulsing rocket, retries the failed action

Extract all visual-state logic into a data-driven lookup table (VISUAL_BY_STATUS) in desktopUpdate.logic.ts — removes the inline ternary chain that was in Sidebar. Add RocketUpdateIcon to Icons.tsx with a fillPercent prop for the download progress overlay. Move the local formatRelativeTime out of Sidebar into the shared utils.ts with full range support (m → h → d → mo → y).

6 files changed, +238 / −57.

Why

The previous update indicator was a plain dot with animate-pulse that gave no visual feedback during download and used a hard-to-follow ternary chain for color selection. The rocket icon communicates action more clearly, the progress fill gives real-time download feedback, and the lookup table makes adding future states trivial.

UI Changes

webappgif8

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Moderate UI/UX change in the sidebar update flow plus a shared formatRelativeTime behavior change, which could affect multiple screens’ timestamps and updater button interactions but not security-critical logic.

Overview
Replaces the sidebar desktop update indicator with a new RocketUpdateIcon that reflects updater status via color/pulse and shows download progress via an SVG fill overlay.

Moves update-button visual styling into desktopUpdate.logic.ts via resolveDesktopUpdateButtonVisualState (data-driven status→classes mapping) and updates tests accordingly, removing the old inline styling/error-highlight helper.

Adds a new pulse-soft animation in index.css and centralizes formatRelativeTime into utils.ts with broader/safer formatting (including yesterday, months, years).

Written by Cursor Bugbot for commit dca7c67. This will update automatically on new commits. Configure here.

Note

Improve desktop update button with status-based visuals and download progress

  • Adds a new RocketUpdateIcon SVG component in Icons.tsx that renders a rocket with an optional bottom-to-top fill overlay driven by fillPercent (0–100) to visualize download progress.
  • Adds resolveDesktopUpdateButtonVisualState in desktopUpdate.logic.ts that maps updater status (available, downloading, downloaded, error) to pulse, color, and hover classes; replaces the removed shouldHighlightDesktopUpdateError.
  • Updates the update button in Sidebar.tsx to use RocketUpdateIcon with download progress fill and status-derived visual classes.
  • Adds a pulse-soft CSS animation in index.css and moves relative time formatting to a shared formatRelativeTime utility in utils.ts.
  • Behavioral Change: tooltip text is now empty (instead of 'Update available') when desktopUpdateState is null; alert action button renders only for download or install actions.

Macroscope summarized dca7c67.

@coderabbitai

coderabbitaiBot commented Mar 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: c103a9aa-f01e-4e6f-943c-d962d49decb4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 26, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 3 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/desktopUpdate.logic.ts
Comment threadapps/web/src/components/Sidebar.tsx Outdated
zycckand others added 2 commits March 26, 2026 04:17
Extract visual state logic into a lookup table in desktopUpdate.logic.ts,
add RocketUpdateIcon with download progress fill to Icons.tsx, and
consolidate formatRelativeTime into shared utils.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@zycck
zycckforce-pushed the desktop-update-button-ux branch from b9c06b8 to 5e6fcdaCompareMarch 26, 2026 01:17
… header
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@zycck
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n 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;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Improve desktop update button with status-based visuals - #1427

Closed
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux
Closed

Improve desktop update button with status-based visuals#1427
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux

Conversation

@zycck

@zycckzycck commented Mar 26, 2026

Copy link
Copy Markdown

What Changed

Replace the generic dot indicator on the desktop update button with a color-coded rocket icon that reflects update state:

  • Available — amber pulsing rocket, prompts download
  • Downloading — sky-blue rocket with real-time SVG fill showing download progress
  • Downloaded — emerald pulsing rocket, prompts install
  • Error — rose pulsing rocket, retries the failed action

Extract all visual-state logic into a data-driven lookup table (VISUAL_BY_STATUS) in desktopUpdate.logic.ts — removes the inline ternary chain that was in Sidebar. Add RocketUpdateIcon to Icons.tsx with a fillPercent prop for the download progress overlay. Move the local formatRelativeTime out of Sidebar into the shared utils.ts with full range support (m → h → d → mo → y).

6 files changed, +238 / −57.

Why

The previous update indicator was a plain dot with animate-pulse that gave no visual feedback during download and used a hard-to-follow ternary chain for color selection. The rocket icon communicates action more clearly, the progress fill gives real-time download feedback, and the lookup table makes adding future states trivial.

UI Changes

webappgif8

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Moderate UI/UX change in the sidebar update flow plus a shared formatRelativeTime behavior change, which could affect multiple screens’ timestamps and updater button interactions but not security-critical logic.

Overview
Replaces the sidebar desktop update indicator with a new RocketUpdateIcon that reflects updater status via color/pulse and shows download progress via an SVG fill overlay.

Moves update-button visual styling into desktopUpdate.logic.ts via resolveDesktopUpdateButtonVisualState (data-driven status→classes mapping) and updates tests accordingly, removing the old inline styling/error-highlight helper.

Adds a new pulse-soft animation in index.css and centralizes formatRelativeTime into utils.ts with broader/safer formatting (including yesterday, months, years).

Written by Cursor Bugbot for commit dca7c67. This will update automatically on new commits. Configure here.

Note

Improve desktop update button with status-based visuals and download progress

  • Adds a new RocketUpdateIcon SVG component in Icons.tsx that renders a rocket with an optional bottom-to-top fill overlay driven by fillPercent (0–100) to visualize download progress.
  • Adds resolveDesktopUpdateButtonVisualState in desktopUpdate.logic.ts that maps updater status (available, downloading, downloaded, error) to pulse, color, and hover classes; replaces the removed shouldHighlightDesktopUpdateError.
  • Updates the update button in Sidebar.tsx to use RocketUpdateIcon with download progress fill and status-derived visual classes.
  • Adds a pulse-soft CSS animation in index.css and moves relative time formatting to a shared formatRelativeTime utility in utils.ts.
  • Behavioral Change: tooltip text is now empty (instead of 'Update available') when desktopUpdateState is null; alert action button renders only for download or install actions.

Macroscope summarized dca7c67.

@coderabbitai

coderabbitaiBot commented Mar 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: c103a9aa-f01e-4e6f-943c-d962d49decb4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 26, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 3 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/desktopUpdate.logic.ts
Comment threadapps/web/src/components/Sidebar.tsx Outdated
zycckand others added 2 commits March 26, 2026 04:17
Extract visual state logic into a lookup table in desktopUpdate.logic.ts,
add RocketUpdateIcon with download progress fill to Icons.tsx, and
consolidate formatRelativeTime into shared utils.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@zycck
zycckforce-pushed the desktop-update-button-ux branch from b9c06b8 to 5e6fcdaCompareMarch 26, 2026 01:17
… header
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@zycck
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Improve desktop update button with status-based visuals - #1427

Closed
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux
Closed

Improve desktop update button with status-based visuals#1427
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux

Conversation

@zycck

@zycckzycck commented Mar 26, 2026

Copy link
Copy Markdown

What Changed

Replace the generic dot indicator on the desktop update button with a color-coded rocket icon that reflects update state:

  • Available — amber pulsing rocket, prompts download
  • Downloading — sky-blue rocket with real-time SVG fill showing download progress
  • Downloaded — emerald pulsing rocket, prompts install
  • Error — rose pulsing rocket, retries the failed action

Extract all visual-state logic into a data-driven lookup table (VISUAL_BY_STATUS) in desktopUpdate.logic.ts — removes the inline ternary chain that was in Sidebar. Add RocketUpdateIcon to Icons.tsx with a fillPercent prop for the download progress overlay. Move the local formatRelativeTime out of Sidebar into the shared utils.ts with full range support (m → h → d → mo → y).

6 files changed, +238 / −57.

Why

The previous update indicator was a plain dot with animate-pulse that gave no visual feedback during download and used a hard-to-follow ternary chain for color selection. The rocket icon communicates action more clearly, the progress fill gives real-time download feedback, and the lookup table makes adding future states trivial.

UI Changes

webappgif8

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Moderate UI/UX change in the sidebar update flow plus a shared formatRelativeTime behavior change, which could affect multiple screens’ timestamps and updater button interactions but not security-critical logic.

Overview
Replaces the sidebar desktop update indicator with a new RocketUpdateIcon that reflects updater status via color/pulse and shows download progress via an SVG fill overlay.

Moves update-button visual styling into desktopUpdate.logic.ts via resolveDesktopUpdateButtonVisualState (data-driven status→classes mapping) and updates tests accordingly, removing the old inline styling/error-highlight helper.

Adds a new pulse-soft animation in index.css and centralizes formatRelativeTime into utils.ts with broader/safer formatting (including yesterday, months, years).

Written by Cursor Bugbot for commit dca7c67. This will update automatically on new commits. Configure here.

Note

Improve desktop update button with status-based visuals and download progress

  • Adds a new RocketUpdateIcon SVG component in Icons.tsx that renders a rocket with an optional bottom-to-top fill overlay driven by fillPercent (0–100) to visualize download progress.
  • Adds resolveDesktopUpdateButtonVisualState in desktopUpdate.logic.ts that maps updater status (available, downloading, downloaded, error) to pulse, color, and hover classes; replaces the removed shouldHighlightDesktopUpdateError.
  • Updates the update button in Sidebar.tsx to use RocketUpdateIcon with download progress fill and status-derived visual classes.
  • Adds a pulse-soft CSS animation in index.css and moves relative time formatting to a shared formatRelativeTime utility in utils.ts.
  • Behavioral Change: tooltip text is now empty (instead of 'Update available') when desktopUpdateState is null; alert action button renders only for download or install actions.

Macroscope summarized dca7c67.

@coderabbitai

coderabbitaiBot commented Mar 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: c103a9aa-f01e-4e6f-943c-d962d49decb4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 26, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 3 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/desktopUpdate.logic.ts
Comment threadapps/web/src/components/Sidebar.tsx Outdated
zycckand others added 2 commits March 26, 2026 04:17
Extract visual state logic into a lookup table in desktopUpdate.logic.ts,
add RocketUpdateIcon with download progress fill to Icons.tsx, and
consolidate formatRelativeTime into shared utils.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@zycck
zycckforce-pushed the desktop-update-button-ux branch from b9c06b8 to 5e6fcdaCompareMarch 26, 2026 01:17
… header
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

Improve desktop update button with status-based visuals - #1427

Closed
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux
Closed

Improve desktop update button with status-based visuals#1427
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux

Conversation

@zycck

@zycckzycck commented Mar 26, 2026

Copy link
Copy Markdown

What Changed

Replace the generic dot indicator on the desktop update button with a color-coded rocket icon that reflects update state:

  • Available — amber pulsing rocket, prompts download
  • Downloading — sky-blue rocket with real-time SVG fill showing download progress
  • Downloaded — emerald pulsing rocket, prompts install
  • Error — rose pulsing rocket, retries the failed action

Extract all visual-state logic into a data-driven lookup table (VISUAL_BY_STATUS) in desktopUpdate.logic.ts — removes the inline ternary chain that was in Sidebar. Add RocketUpdateIcon to Icons.tsx with a fillPercent prop for the download progress overlay. Move the local formatRelativeTime out of Sidebar into the shared utils.ts with full range support (m → h → d → mo → y).

6 files changed, +238 / −57.

Why

The previous update indicator was a plain dot with animate-pulse that gave no visual feedback during download and used a hard-to-follow ternary chain for color selection. The rocket icon communicates action more clearly, the progress fill gives real-time download feedback, and the lookup table makes adding future states trivial.

UI Changes

webappgif8

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Moderate UI/UX change in the sidebar update flow plus a shared formatRelativeTime behavior change, which could affect multiple screens’ timestamps and updater button interactions but not security-critical logic.

Overview
Replaces the sidebar desktop update indicator with a new RocketUpdateIcon that reflects updater status via color/pulse and shows download progress via an SVG fill overlay.

Moves update-button visual styling into desktopUpdate.logic.ts via resolveDesktopUpdateButtonVisualState (data-driven status→classes mapping) and updates tests accordingly, removing the old inline styling/error-highlight helper.

Adds a new pulse-soft animation in index.css and centralizes formatRelativeTime into utils.ts with broader/safer formatting (including yesterday, months, years).

Written by Cursor Bugbot for commit dca7c67. This will update automatically on new commits. Configure here.

Note

Improve desktop update button with status-based visuals and download progress

  • Adds a new RocketUpdateIcon SVG component in Icons.tsx that renders a rocket with an optional bottom-to-top fill overlay driven by fillPercent (0–100) to visualize download progress.
  • Adds resolveDesktopUpdateButtonVisualState in desktopUpdate.logic.ts that maps updater status (available, downloading, downloaded, error) to pulse, color, and hover classes; replaces the removed shouldHighlightDesktopUpdateError.
  • Updates the update button in Sidebar.tsx to use RocketUpdateIcon with download progress fill and status-derived visual classes.
  • Adds a pulse-soft CSS animation in index.css and moves relative time formatting to a shared formatRelativeTime utility in utils.ts.
  • Behavioral Change: tooltip text is now empty (instead of 'Update available') when desktopUpdateState is null; alert action button renders only for download or install actions.

Macroscope summarized dca7c67.

@coderabbitai

coderabbitaiBot commented Mar 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: c103a9aa-f01e-4e6f-943c-d962d49decb4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 26, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 3 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/desktopUpdate.logic.ts
Comment threadapps/web/src/components/Sidebar.tsx Outdated
zycckand others added 2 commits March 26, 2026 04:17
Extract visual state logic into a lookup table in desktopUpdate.logic.ts,
add RocketUpdateIcon with download progress fill to Icons.tsx, and
consolidate formatRelativeTime into shared utils.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@zycck
zycckforce-pushed the desktop-update-button-ux branch from b9c06b8 to 5e6fcdaCompareMarch 26, 2026 01:17
… header
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

Improve desktop update button with status-based visuals - #1427

Closed
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux
Closed

Improve desktop update button with status-based visuals#1427
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux

Conversation

@zycck

@zycckzycck commented Mar 26, 2026

Copy link
Copy Markdown

What Changed

Replace the generic dot indicator on the desktop update button with a color-coded rocket icon that reflects update state:

  • Available — amber pulsing rocket, prompts download
  • Downloading — sky-blue rocket with real-time SVG fill showing download progress
  • Downloaded — emerald pulsing rocket, prompts install
  • Error — rose pulsing rocket, retries the failed action

Extract all visual-state logic into a data-driven lookup table (VISUAL_BY_STATUS) in desktopUpdate.logic.ts — removes the inline ternary chain that was in Sidebar. Add RocketUpdateIcon to Icons.tsx with a fillPercent prop for the download progress overlay. Move the local formatRelativeTime out of Sidebar into the shared utils.ts with full range support (m → h → d → mo → y).

6 files changed, +238 / −57.

Why

The previous update indicator was a plain dot with animate-pulse that gave no visual feedback during download and used a hard-to-follow ternary chain for color selection. The rocket icon communicates action more clearly, the progress fill gives real-time download feedback, and the lookup table makes adding future states trivial.

UI Changes

webappgif8

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Moderate UI/UX change in the sidebar update flow plus a shared formatRelativeTime behavior change, which could affect multiple screens’ timestamps and updater button interactions but not security-critical logic.

Overview
Replaces the sidebar desktop update indicator with a new RocketUpdateIcon that reflects updater status via color/pulse and shows download progress via an SVG fill overlay.

Moves update-button visual styling into desktopUpdate.logic.ts via resolveDesktopUpdateButtonVisualState (data-driven status→classes mapping) and updates tests accordingly, removing the old inline styling/error-highlight helper.

Adds a new pulse-soft animation in index.css and centralizes formatRelativeTime into utils.ts with broader/safer formatting (including yesterday, months, years).

Written by Cursor Bugbot for commit dca7c67. This will update automatically on new commits. Configure here.

Note

Improve desktop update button with status-based visuals and download progress

  • Adds a new RocketUpdateIcon SVG component in Icons.tsx that renders a rocket with an optional bottom-to-top fill overlay driven by fillPercent (0–100) to visualize download progress.
  • Adds resolveDesktopUpdateButtonVisualState in desktopUpdate.logic.ts that maps updater status (available, downloading, downloaded, error) to pulse, color, and hover classes; replaces the removed shouldHighlightDesktopUpdateError.
  • Updates the update button in Sidebar.tsx to use RocketUpdateIcon with download progress fill and status-derived visual classes.
  • Adds a pulse-soft CSS animation in index.css and moves relative time formatting to a shared formatRelativeTime utility in utils.ts.
  • Behavioral Change: tooltip text is now empty (instead of 'Update available') when desktopUpdateState is null; alert action button renders only for download or install actions.

Macroscope summarized dca7c67.

@coderabbitai

coderabbitaiBot commented Mar 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: c103a9aa-f01e-4e6f-943c-d962d49decb4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 26, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 3 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/desktopUpdate.logic.ts
Comment threadapps/web/src/components/Sidebar.tsx Outdated
zycckand others added 2 commits March 26, 2026 04:17
Extract visual state logic into a lookup table in desktopUpdate.logic.ts,
add RocketUpdateIcon with download progress fill to Icons.tsx, and
consolidate formatRelativeTime into shared utils.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@zycck
zycckforce-pushed the desktop-update-button-ux branch from b9c06b8 to 5e6fcdaCompareMarch 26, 2026 01:17
… header
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@zycck
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Improve desktop update button with status-based visuals - #1427

Closed
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux
Closed

Improve desktop update button with status-based visuals#1427
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux

Conversation

@zycck

@zycckzycck commented Mar 26, 2026

Copy link
Copy Markdown

What Changed

Replace the generic dot indicator on the desktop update button with a color-coded rocket icon that reflects update state:

  • Available — amber pulsing rocket, prompts download
  • Downloading — sky-blue rocket with real-time SVG fill showing download progress
  • Downloaded — emerald pulsing rocket, prompts install
  • Error — rose pulsing rocket, retries the failed action

Extract all visual-state logic into a data-driven lookup table (VISUAL_BY_STATUS) in desktopUpdate.logic.ts — removes the inline ternary chain that was in Sidebar. Add RocketUpdateIcon to Icons.tsx with a fillPercent prop for the download progress overlay. Move the local formatRelativeTime out of Sidebar into the shared utils.ts with full range support (m → h → d → mo → y).

6 files changed, +238 / −57.

Why

The previous update indicator was a plain dot with animate-pulse that gave no visual feedback during download and used a hard-to-follow ternary chain for color selection. The rocket icon communicates action more clearly, the progress fill gives real-time download feedback, and the lookup table makes adding future states trivial.

UI Changes

webappgif8

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Moderate UI/UX change in the sidebar update flow plus a shared formatRelativeTime behavior change, which could affect multiple screens’ timestamps and updater button interactions but not security-critical logic.

Overview
Replaces the sidebar desktop update indicator with a new RocketUpdateIcon that reflects updater status via color/pulse and shows download progress via an SVG fill overlay.

Moves update-button visual styling into desktopUpdate.logic.ts via resolveDesktopUpdateButtonVisualState (data-driven status→classes mapping) and updates tests accordingly, removing the old inline styling/error-highlight helper.

Adds a new pulse-soft animation in index.css and centralizes formatRelativeTime into utils.ts with broader/safer formatting (including yesterday, months, years).

Written by Cursor Bugbot for commit dca7c67. This will update automatically on new commits. Configure here.

Note

Improve desktop update button with status-based visuals and download progress

  • Adds a new RocketUpdateIcon SVG component in Icons.tsx that renders a rocket with an optional bottom-to-top fill overlay driven by fillPercent (0–100) to visualize download progress.
  • Adds resolveDesktopUpdateButtonVisualState in desktopUpdate.logic.ts that maps updater status (available, downloading, downloaded, error) to pulse, color, and hover classes; replaces the removed shouldHighlightDesktopUpdateError.
  • Updates the update button in Sidebar.tsx to use RocketUpdateIcon with download progress fill and status-derived visual classes.
  • Adds a pulse-soft CSS animation in index.css and moves relative time formatting to a shared formatRelativeTime utility in utils.ts.
  • Behavioral Change: tooltip text is now empty (instead of 'Update available') when desktopUpdateState is null; alert action button renders only for download or install actions.

Macroscope summarized dca7c67.

@coderabbitai

coderabbitaiBot commented Mar 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: c103a9aa-f01e-4e6f-943c-d962d49decb4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 26, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 3 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/desktopUpdate.logic.ts
Comment threadapps/web/src/components/Sidebar.tsx Outdated
zycckand others added 2 commits March 26, 2026 04:17
Extract visual state logic into a lookup table in desktopUpdate.logic.ts,
add RocketUpdateIcon with download progress fill to Icons.tsx, and
consolidate formatRelativeTime into shared utils.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@zycck
zycckforce-pushed the desktop-update-button-ux branch from b9c06b8 to 5e6fcdaCompareMarch 26, 2026 01:17
… header
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@zycck
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Improve desktop update button with status-based visuals - #1427

Closed
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux
Closed

Improve desktop update button with status-based visuals#1427
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux

Conversation

@zycck

@zycckzycck commented Mar 26, 2026

Copy link
Copy Markdown

What Changed

Replace the generic dot indicator on the desktop update button with a color-coded rocket icon that reflects update state:

  • Available — amber pulsing rocket, prompts download
  • Downloading — sky-blue rocket with real-time SVG fill showing download progress
  • Downloaded — emerald pulsing rocket, prompts install
  • Error — rose pulsing rocket, retries the failed action

Extract all visual-state logic into a data-driven lookup table (VISUAL_BY_STATUS) in desktopUpdate.logic.ts — removes the inline ternary chain that was in Sidebar. Add RocketUpdateIcon to Icons.tsx with a fillPercent prop for the download progress overlay. Move the local formatRelativeTime out of Sidebar into the shared utils.ts with full range support (m → h → d → mo → y).

6 files changed, +238 / −57.

Why

The previous update indicator was a plain dot with animate-pulse that gave no visual feedback during download and used a hard-to-follow ternary chain for color selection. The rocket icon communicates action more clearly, the progress fill gives real-time download feedback, and the lookup table makes adding future states trivial.

UI Changes

webappgif8

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Moderate UI/UX change in the sidebar update flow plus a shared formatRelativeTime behavior change, which could affect multiple screens’ timestamps and updater button interactions but not security-critical logic.

Overview
Replaces the sidebar desktop update indicator with a new RocketUpdateIcon that reflects updater status via color/pulse and shows download progress via an SVG fill overlay.

Moves update-button visual styling into desktopUpdate.logic.ts via resolveDesktopUpdateButtonVisualState (data-driven status→classes mapping) and updates tests accordingly, removing the old inline styling/error-highlight helper.

Adds a new pulse-soft animation in index.css and centralizes formatRelativeTime into utils.ts with broader/safer formatting (including yesterday, months, years).

Written by Cursor Bugbot for commit dca7c67. This will update automatically on new commits. Configure here.

Note

Improve desktop update button with status-based visuals and download progress

  • Adds a new RocketUpdateIcon SVG component in Icons.tsx that renders a rocket with an optional bottom-to-top fill overlay driven by fillPercent (0–100) to visualize download progress.
  • Adds resolveDesktopUpdateButtonVisualState in desktopUpdate.logic.ts that maps updater status (available, downloading, downloaded, error) to pulse, color, and hover classes; replaces the removed shouldHighlightDesktopUpdateError.
  • Updates the update button in Sidebar.tsx to use RocketUpdateIcon with download progress fill and status-derived visual classes.
  • Adds a pulse-soft CSS animation in index.css and moves relative time formatting to a shared formatRelativeTime utility in utils.ts.
  • Behavioral Change: tooltip text is now empty (instead of 'Update available') when desktopUpdateState is null; alert action button renders only for download or install actions.

Macroscope summarized dca7c67.

@coderabbitai

coderabbitaiBot commented Mar 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: c103a9aa-f01e-4e6f-943c-d962d49decb4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 26, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 3 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/desktopUpdate.logic.ts
Comment threadapps/web/src/components/Sidebar.tsx Outdated
zycckand others added 2 commits March 26, 2026 04:17
Extract visual state logic into a lookup table in desktopUpdate.logic.ts,
add RocketUpdateIcon with download progress fill to Icons.tsx, and
consolidate formatRelativeTime into shared utils.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@zycck
zycckforce-pushed the desktop-update-button-ux branch from b9c06b8 to 5e6fcdaCompareMarch 26, 2026 01:17
… header
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

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

Improve desktop update button with status-based visuals - #1427

Closed
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux
Closed

Improve desktop update button with status-based visuals#1427
zycck wants to merge 3 commits into
pingdotgg:mainfrom
zycck:desktop-update-button-ux

Conversation

@zycck

@zycckzycck commented Mar 26, 2026

Copy link
Copy Markdown

What Changed

Replace the generic dot indicator on the desktop update button with a color-coded rocket icon that reflects update state:

  • Available — amber pulsing rocket, prompts download
  • Downloading — sky-blue rocket with real-time SVG fill showing download progress
  • Downloaded — emerald pulsing rocket, prompts install
  • Error — rose pulsing rocket, retries the failed action

Extract all visual-state logic into a data-driven lookup table (VISUAL_BY_STATUS) in desktopUpdate.logic.ts — removes the inline ternary chain that was in Sidebar. Add RocketUpdateIcon to Icons.tsx with a fillPercent prop for the download progress overlay. Move the local formatRelativeTime out of Sidebar into the shared utils.ts with full range support (m → h → d → mo → y).

6 files changed, +238 / −57.

Why

The previous update indicator was a plain dot with animate-pulse that gave no visual feedback during download and used a hard-to-follow ternary chain for color selection. The rocket icon communicates action more clearly, the progress fill gives real-time download feedback, and the lookup table makes adding future states trivial.

UI Changes

webappgif8

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Moderate UI/UX change in the sidebar update flow plus a shared formatRelativeTime behavior change, which could affect multiple screens’ timestamps and updater button interactions but not security-critical logic.

Overview
Replaces the sidebar desktop update indicator with a new RocketUpdateIcon that reflects updater status via color/pulse and shows download progress via an SVG fill overlay.

Moves update-button visual styling into desktopUpdate.logic.ts via resolveDesktopUpdateButtonVisualState (data-driven status→classes mapping) and updates tests accordingly, removing the old inline styling/error-highlight helper.

Adds a new pulse-soft animation in index.css and centralizes formatRelativeTime into utils.ts with broader/safer formatting (including yesterday, months, years).

Written by Cursor Bugbot for commit dca7c67. This will update automatically on new commits. Configure here.

Note

Improve desktop update button with status-based visuals and download progress

  • Adds a new RocketUpdateIcon SVG component in Icons.tsx that renders a rocket with an optional bottom-to-top fill overlay driven by fillPercent (0–100) to visualize download progress.
  • Adds resolveDesktopUpdateButtonVisualState in desktopUpdate.logic.ts that maps updater status (available, downloading, downloaded, error) to pulse, color, and hover classes; replaces the removed shouldHighlightDesktopUpdateError.
  • Updates the update button in Sidebar.tsx to use RocketUpdateIcon with download progress fill and status-derived visual classes.
  • Adds a pulse-soft CSS animation in index.css and moves relative time formatting to a shared formatRelativeTime utility in utils.ts.
  • Behavioral Change: tooltip text is now empty (instead of 'Update available') when desktopUpdateState is null; alert action button renders only for download or install actions.

Macroscope summarized dca7c67.

@coderabbitai

coderabbitaiBot commented Mar 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: c103a9aa-f01e-4e6f-943c-d962d49decb4

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Mar 26, 2026

@cursorcursorBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 3 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Comment threadapps/web/src/components/Sidebar.tsx Outdated
Comment threadapps/web/src/components/desktopUpdate.logic.ts
Comment threadapps/web/src/components/Sidebar.tsx Outdated
zycckand others added 2 commits March 26, 2026 04:17
Extract visual state logic into a lookup table in desktopUpdate.logic.ts,
add RocketUpdateIcon with download progress fill to Icons.tsx, and
consolidate formatRelativeTime into shared utils.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@zycck
zycckforce-pushed the desktop-update-button-ux branch from b9c06b8 to 5e6fcdaCompareMarch 26, 2026 01:17
… header
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@zycck