Skip to content
This repository was archived by the owner on Feb 18, 2026. It is now read-only.

Comments

fix(ux): 🎨 improve accessibility and loading feedback in user menu#565

Draft
yacosta738 wants to merge 1 commit intomainfrom
palette/improve-user-nav-ux-13520054943768497714
Draft

fix(ux): 🎨 improve accessibility and loading feedback in user menu#565
yacosta738 wants to merge 1 commit intomainfrom
palette/improve-user-nav-ux-13520054943768497714

Conversation

@yacosta738
Copy link
Contributor

This PR improves the micro-UX and accessibility of the user navigation component (UserNav.vue).

Key changes:

  1. Accessibility: Added a dynamic :aria-label="'User menu for ' + getDisplayName(user)" to the DropdownMenuTrigger. This ensures screen reader users understand the purpose of the avatar button.
  2. Feedback: Integrated the Loader2 icon from lucide-vue-next to show a spinning loader when the logout process is active (isLoggingOut). This replaces the static sign-out icon during the transition, providing better interaction feedback.

The changes are well under the 50-line limit and follow the project's design patterns.


PR created automatically by Jules for task 13520054943768497714 started by @yacosta738

- Added aria-label to user menu trigger for better screen reader support
- Implemented loading spinner for logout action to provide visual feedback
- Improved overall micro-UX of the navigation component

Co-authored-by: yacosta738 <33158051+yacosta738@users.noreply.github.com>
@google-labs-jules
Copy link
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@github-actions github-actions bot added the area:frontend:web Changes in frontend web app (client/apps/webapp/**) label Feb 5, 2026
@sonarqubecloud
Copy link

sonarqubecloud bot commented Feb 5, 2026

@github-actions
Copy link
Contributor

github-actions bot commented Feb 5, 2026

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 5, 2026

📝 Walkthrough

Summary by CodeRabbit

  • New Features
    • Added visual loading indicator during logout that displays "Logging out..." status
    • Enhanced accessibility for navigation controls with improved labeling

Walkthrough

Enhanced the logout experience in UserNav.vue by adding visual feedback with a spinner icon during logout and improving button accessibility with an aria-label attribute bound to the current user display name.

Changes

Cohort / File(s) Summary
Logout UX Enhancement
client/apps/webapp/src/components/UserNav.vue
Added Loader2 icon import, aria-label accessibility binding to button, and conditional spinner + text state ("Logging out..." vs "Log out") during logout operations.

Estimated code review effort

🎯 1 (Trivial) | ⏱️ ~2 minutes

Suggested labels

frontend

Poem

🌀 A spinner twirls, the logout takes flight,
With aria-labels shining bright,
User feedback, accessible and clear—
Progress shows up without a fear! ✨


Caution

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

  • Ignore
❌ Failed checks (1 error, 1 warning)
Check name Status Explanation Resolution
Clean Architecture Compliance ❌ Error PR changes remain correctly scoped to presentation layer, but codebase violates Clean Architecture: authentication module lacks application layer present in other modules, CQRS pattern unimplemented, and domain layer contains framework dependencies (Zod). Implement application layer in authentication module, introduce CQRS handlers across modules, move Zod schemas from domain layer, and ensure presentation components depend on application use cases rather than infrastructure.
Test Coverage ⚠️ Warning PR modifies critical logout functionality with new loading state and accessibility features but adds zero test coverage for the new business logic. Create UserNav.spec.ts with Vitest/Vue Test Utils covering handleLogout behavior, aria-label rendering, Loader2 visibility, and loading state transitions.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title follows Conventional Commits format with 'fix(ux):' prefix, includes an emoji, and accurately describes the main changes (accessibility and loading feedback improvements).
Description check ✅ Passed The description is directly related to the changeset, providing specific details about accessibility improvements and loading feedback enhancements in UserNav.vue.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Security Review ✅ Passed UserNav.vue component exhibits no security vulnerabilities. All user data safely rendered through Vue.js templating with automatic HTML escaping, authentication properly delegated to authStore, and defensive null-checks implemented throughout.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch palette/improve-user-nav-ux-13520054943768497714

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.

@cloudflare-workers-and-pages
Copy link

Deploying cvix with  Cloudflare Pages  Cloudflare Pages

Latest commit: e8ccfdc
Status: ✅  Deploy successful!
Preview URL: https://3a6ead74.cvix.pages.dev
Branch Preview URL: https://palette-improve-user-nav-ux.cvix.pages.dev

View logs

@coderabbitai coderabbitai bot added the frontend label Feb 5, 2026
@sentry
Copy link

sentry bot commented Feb 5, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 75.83%. Comparing base (abf87b3) to head (e8ccfdc).
⚠️ Report is 10 commits behind head on main.

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #565   +/-   ##
=======================================
  Coverage   75.83%   75.83%           
=======================================
  Files         115      115           
  Lines        3824     3824           
  Branches     1003     1003           
=======================================
  Hits         2900     2900           
  Misses        815      815           
  Partials      109      109           
Flag Coverage Δ
frontend 75.83% <ø> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@client/apps/webapp/src/components/UserNav.vue`:
- Around line 118-122: Add an ARIA busy indicator to improve screen-reader
feedback: on the DropdownMenuItem that uses :disabled="isLoggingOut" (the
element with Loader2 / PhSignOutLight and span), bind aria-busy to isLoggingOut
(e.g., aria-busy="isLoggingOut") and also consider adding
aria-disabled="isLoggingOut" for explicit assistive-tech disabling; keep the
existing handleLogout and isLoggingOut logic unchanged.

Comment on lines 118 to 122
<DropdownMenuItem @click="handleLogout" :disabled="isLoggingOut">
<PhSignOutLight class="mr-2 h-4 w-4" />
<Loader2 v-if="isLoggingOut" class="mr-2 h-4 w-4 animate-spin" />
<PhSignOutLight v-else class="mr-2 h-4 w-4" />
<span>{{ isLoggingOut ? "Logging out..." : "Log out" }}</span>
</DropdownMenuItem>
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Well-implemented loading state with proper disabled handling.

The pattern here is correct:

  • Loader2 with animate-spin provides clear visual feedback during logout
  • :disabled="isLoggingOut" prevents double-click issues
  • Text updates to "Logging out..." for additional clarity

Consider adding aria-busy="true" to the menu item during logout for enhanced screen reader feedback, though the current implementation is functionally solid.

♿ Optional: Enhanced accessibility during loading state
-      <DropdownMenuItem `@click`="handleLogout" :disabled="isLoggingOut">
+      <DropdownMenuItem `@click`="handleLogout" :disabled="isLoggingOut" :aria-busy="isLoggingOut">
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<DropdownMenuItem @click="handleLogout" :disabled="isLoggingOut">
<PhSignOutLight class="mr-2 h-4 w-4" />
<Loader2 v-if="isLoggingOut" class="mr-2 h-4 w-4 animate-spin" />
<PhSignOutLight v-else class="mr-2 h-4 w-4" />
<span>{{ isLoggingOut ? "Logging out..." : "Log out" }}</span>
</DropdownMenuItem>
<DropdownMenuItem `@click`="handleLogout" :disabled="isLoggingOut" :aria-busy="isLoggingOut">
<Loader2 v-if="isLoggingOut" class="mr-2 h-4 w-4 animate-spin" />
<PhSignOutLight v-else class="mr-2 h-4 w-4" />
<span>{{ isLoggingOut ? "Logging out..." : "Log out" }}</span>
</DropdownMenuItem>
🤖 Prompt for AI Agents
In `@client/apps/webapp/src/components/UserNav.vue` around lines 118 - 122, Add an
ARIA busy indicator to improve screen-reader feedback: on the DropdownMenuItem
that uses :disabled="isLoggingOut" (the element with Loader2 / PhSignOutLight
and span), bind aria-busy to isLoggingOut (e.g., aria-busy="isLoggingOut") and
also consider adding aria-disabled="isLoggingOut" for explicit assistive-tech
disabling; keep the existing handleLogout and isLoggingOut logic unchanged.

@github-actions
Copy link
Contributor

github-actions bot commented Feb 5, 2026

Qodana for JVM

142 new problems were found

Inspection name Severity Problems
Invalid @ConfigurationProperties 🔴 Failure 1
Invalid YAML configuration 🔴 Failure 1
Unused symbol 🔶 Warning 48
Invalid YAML configuration 🔶 Warning 40
Unresolved reference in KDoc 🔶 Warning 5
Taint analysis 🔶 Warning 4
Potentially ambiguous 'kotlin.coroutine.coroutineContext' usage 🔶 Warning 4
Unused import directive 🔶 Warning 1
Redundant character escape 🔶 Warning 1
Vulnerable declared dependency 🔶 Warning 1
Duplicated code fragment ◽️ Notice 12
Unknown HTTP header ◽️ Notice 10
Redundant interpolation prefix ◽️ Notice 4
Vulnerable declared dependency ◽️ Notice 3
Multi-dollar interpolation can be used in string literals (available since 2.1) ◽️ Notice 1
Redundant escaped dollar characters in string literals ◽️ Notice 1
String concatenation that can be converted to string template ◽️ Notice 1
If-Null return/break/... foldable to '?:' ◽️ Notice 1
Redundant empty initializer block ◽️ Notice 1
Unnecessary type argument ◽️ Notice 1
'substring' call should be replaced with 'take' call ◽️ Notice 1

☁️ View the detailed Qodana report

Contact Qodana team

Contact us at qodana-support@jetbrains.com

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

area:frontend:web Changes in frontend web app (client/apps/webapp/**) frontend

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant