Skip to content

Polish visual issues on the Console Home Page - #4617

Merged
brionmario merged 1 commit into
thunder-id:mainfrom
brionmario:home-page-integration-banner
Aug 6, 2026
Merged

Polish visual issues on the Console Home Page#4617
brionmario merged 1 commit into
thunder-id:mainfrom
brionmario:home-page-integration-banner

Conversation

@brionmario

@brionmario brionmario commented Aug 6, 2026

Copy link
Copy Markdown
Member

Purpose

The Home page's "Integrate ThunderID into your application" banner used a purely decorative, always-scrolling background of technology logos and didn't reflect the SDKs ThunderID actually ships. The "Add Users" quick-link card also rendered every member as flat initials, never showing their real profile photo even when one was set.

Approach

  • Replaced the scrolling HomeFloatingLogos background with FrameworkFlipCard, a compact widget that flips between ThunderID's real supported SDKs (React, Next.js, Vue, Nuxt, Express, JavaScript), pulling icons from @thunderid/components. Each card links to its application template (applications/types?type=<ID>).
  • Made the widget responsive: hidden below lg, one card at lgxl, three at xl+, so it never squeezes the banner's title/actions at in-between viewport widths.
  • Gave the banner its own visual treatment (blue-tinted border, soft radial glow) so it reads as the "hero" card rather than a plain outlined tile like the Quick Links cards below it.
  • Swapped the app-count indicator from a Chip to inline text with an ArrowRight icon, and fixed it to navigate to the actual application listing instead of the create-flow picker.
  • Changed the Quick Links cards' primary action to a text button with ArrowRight, for a lighter, consistent call-to-action style.
  • Fixed InviteMembersCard's avatar preview to use ResourceAvatar (the same component the Users list page uses), so members with a profile photo show it instead of always falling back to initials.
Screenshot 2026-08-06 at 12 32 05 Screenshot 2026-08-06 at 12 32 10

Related Issues

Related PRs

  • N/A

Checklist

  • Followed the contribution guidelines.
  • Manual test round performed and verified.
  • Documentation provided. (Add links if there are any)
    • Ran Vale and fixed all errors and warnings
  • Tests provided. (Add links if there are any)
    • Unit Tests
    • Integration Tests
  • Breaking changes. (Fill if applicable)
    • Breaking changes section filled.
    • breaking change label added.

Security checks

  • Followed secure coding standards in WSO2 Secure Coding Guidelines
  • Confirmed that this PR doesn't commit any keys, passwords, tokens, usernames, or other secrets.

Summary by CodeRabbit

  • New Features
    • Added an animated framework template card that rotates through SDK options and links directly to application templates.
    • Updated the Start Building section with responsive layouts, themed styling, decorative backgrounds, and application-count navigation.
    • Improved member previews with profile images and initials-based fallback avatars.
  • Improvements
    • Refined quick-link layouts for better medium-screen responsiveness.
    • Updated action buttons with clearer text styling and arrow indicators.
    • Updated homepage messaging, including “Get Started” and “Start with a Template.”

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The home page replaces floating logos with animated framework template cards. It updates responsive styling, application navigation, avatar rendering, action buttons, quick-link breakpoints, translations, and related tests.

Changes

Home experience

Layer / File(s) Summary
Framework registry and flip-card flow
frontend/apps/console/src/features/home/components/FrameworkFlipCard.tsx, frontend/apps/console/src/features/home/components/__tests__/FrameworkFlipCard.test.tsx
Adds themed, independently staggered framework cards that navigate to application templates. Tests cover default slots, single-slot rendering, and navigation.
Start-building section integration
frontend/apps/console/src/features/home/components/StartBuildingSection.tsx, frontend/apps/console/src/features/home/components/__tests__/StartBuildingSection.test.tsx, frontend/apps/console/src/features/home/components/HomeFloatingLogos.tsx, frontend/packages/i18n/src/locales/en-US.ts
Replaces floating logos with responsive framework cards, themed hero styling, application-list navigation, and updated translations. Removes floating-logo rendering and its related test coverage.
Home card avatar and action updates
frontend/apps/console/src/features/home/components/cards/InviteMembersCard.tsx, frontend/apps/console/src/features/home/components/cards/__tests__/InviteMembersCard.test.tsx, frontend/apps/console/src/features/home/components/cards/HomeNextStepCard.tsx, frontend/apps/console/src/features/home/components/NextStepsSection.tsx, frontend/packages/configure-users/src/index.ts
Uses ResourceAvatar with profile-picture and fallback support, changes the next-step action styling, and updates quick-link grid breakpoints.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant StartBuildingSection
  participant FrameworkFlipCard
  participant ApplicationTemplate
  StartBuildingSection->>FrameworkFlipCard: Render one or three framework slots
  FrameworkFlipCard->>ApplicationTemplate: Navigate with selected template
Loading

Possibly related PRs

Suggested reviewers: jeradrutnam, donomalvindula

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the Console Home Page visual polish changes.
Description check ✅ Passed The description explains the purpose and approach, links the issue, includes screenshots, and records testing and security checks.
Linked Issues check ✅ Passed The changes address both linked issue objectives by replacing the distracting logo slider and correcting Add Users avatar rendering [#4612].
Out of Scope Changes check ✅ Passed The additional responsive styling, navigation, CTA, translation, and avatar updates support the stated Console Home Page visual polish objectives.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

frontend/apps/console/src/features/home/components/FrameworkFlipCard.tsx

ESLint skipped: missing config or dependency (missing-dependency). The ESLint configuration references a package that is not available in the sandbox.

frontend/apps/console/src/features/home/components/NextStepsSection.tsx

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

frontend/apps/console/src/features/home/components/StartBuildingSection.tsx

ESLint skipped: the ESLint configuration for this file references a package that is not available in the sandbox.

  • 7 others

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.

@brionmario brionmario changed the title Redesign the Applications integration banner on the Home page Polish Home Page Content Aug 6, 2026
@brionmario brionmario added Type/Improvement trigger-pr-builder Add when the PR is ready for CI; starts the PR Builder for this and all later pushes labels Aug 6, 2026
@brionmario brionmario changed the title Polish Home Page Content Polish visual issues on the Console Home Page Aug 6, 2026

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@frontend/apps/console/src/features/home/components/cards/InviteMembersCard.tsx`:
- Around line 57-65: Update the fallback construction in the users.map callback
to pass user.display ?? user.id to getInitials, preserving display-based
initials while providing a stable user.id fallback when display is missing.

In `@frontend/apps/console/src/features/home/components/FrameworkFlipCard.tsx`:
- Around line 76-101: Update the framework cards rendered by the frameworks.map
loop to derive active state from the animation and set inactive buttons to
tabIndex={-1} with aria-hidden, while keeping the active card
keyboard-focusable. Ensure the animation does not hide or advance away from a
card while it has focus.

In `@frontend/apps/console/src/features/home/components/StartBuildingSection.tsx`:
- Around line 111-129: Replace the clickable Box in the application-count action
with a semantic Button or link that invokes goToApplicationList and supports
keyboard activation. Preserve the existing inline layout, color, spacing,
cursor, and nowrap styling on the new control, while keeping the Typography
content and ArrowRight indicator unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d028a7b0-eafa-4b29-815b-25a1c11266ac

📥 Commits

Reviewing files that changed from the base of the PR and between c2444e1 and ab72548.

📒 Files selected for processing (11)
  • frontend/apps/console/src/features/home/components/FrameworkFlipCard.tsx
  • frontend/apps/console/src/features/home/components/HomeFloatingLogos.tsx
  • frontend/apps/console/src/features/home/components/StartBuildingSection.tsx
  • frontend/apps/console/src/features/home/components/__tests__/HomeFloatingLogos.test.tsx
  • frontend/apps/console/src/features/home/components/__tests__/StartBuildingSection.test.tsx
  • frontend/apps/console/src/features/home/components/cards/HomeNextStepCard.tsx
  • frontend/apps/console/src/features/home/components/cards/InviteMembersCard.tsx
  • frontend/apps/console/src/features/home/components/cards/__tests__/InviteMembersCard.test.tsx
  • frontend/apps/console/src/features/home/components/frameworks.ts
  • frontend/packages/configure-users/src/index.ts
  • frontend/packages/i18n/src/locales/en-US.ts
💤 Files with no reviewable changes (3)
  • frontend/apps/console/src/features/home/components/tests/StartBuildingSection.test.tsx
  • frontend/apps/console/src/features/home/components/HomeFloatingLogos.tsx
  • frontend/apps/console/src/features/home/components/tests/HomeFloatingLogos.test.tsx

Comment on lines +57 to +65
{users.map((user) => {
const picture = user.attributes?.picture;

return (
<motion.div key={user.id} variants={avatarVariants}>
<ResourceAvatar
value={typeof picture === 'string' ? picture : undefined}
size={32}
fallback={`${UserConstants.DEFAULT_AVATAR_PREFIX}${getInitials(user.display)}`}

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use user.id when user.display is missing.

display is optional, but the fallback calls getInitials(user.display). Users without a display value do not receive a stable initials fallback. Use getInitials(user.display ?? user.id), matching the existing UsersList.tsx behavior.

Proposed fix
 {users.map((user) => {
+  const display = user.display ?? user.id;
   const picture = user.attributes?.picture;

   return (
     <motion.div key={user.id} variants={avatarVariants}>
       <ResourceAvatar
         value={typeof picture === 'string' ? picture : undefined}
         size={32}
-        fallback={`${UserConstants.DEFAULT_AVATAR_PREFIX}${getInitials(user.display)}`}
+        fallback={`${UserConstants.DEFAULT_AVATAR_PREFIX}${getInitials(display)}`}
       />
     </motion.div>
   );
 })}
📝 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
{users.map((user) => {
const picture = user.attributes?.picture;
return (
<motion.div key={user.id} variants={avatarVariants}>
<ResourceAvatar
value={typeof picture === 'string' ? picture : undefined}
size={32}
fallback={`${UserConstants.DEFAULT_AVATAR_PREFIX}${getInitials(user.display)}`}
{users.map((user) => {
const display = user.display ?? user.id;
const picture = user.attributes?.picture;
return (
<motion.div key={user.id} variants={avatarVariants}>
<ResourceAvatar
value={typeof picture === 'string' ? picture : undefined}
size={32}
fallback={`${UserConstants.DEFAULT_AVATAR_PREFIX}${getInitials(display)}`}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@frontend/apps/console/src/features/home/components/cards/InviteMembersCard.tsx`
around lines 57 - 65, Update the fallback construction in the users.map callback
to pass user.display ?? user.id to getInitials, preserving display-based
initials while providing a stable user.id fallback when display is missing.

Comment on lines +76 to +101
{frameworks.map(({Icon, label, templateId}, index) => (
<Box
key={label}
component="button"
type="button"
onClick={() => onSelect(templateId)}
sx={{
position: 'absolute',
inset: 0,
display: 'flex',
alignItems: 'center',
gap: 1.5,
px: 2,
border: '1px solid',
borderColor: isDark ? 'rgba(255,255,255,0.10)' : 'rgba(0,0,0,0.08)',
borderRadius: 1.5,
bgcolor: isDark ? 'rgba(255,255,255,0.05)' : 'rgba(0,0,0,0.03)',
cursor: 'pointer',
font: 'inherit',
backfaceVisibility: 'hidden',
animation: `${animationName} ${cycleSeconds}s infinite backwards`,
animationDelay: `${index * staggerSeconds}s`,
'&:hover': {
borderColor: 'primary.main',
},
}}

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Remove inactive cards from keyboard navigation.

At Line 76, every framework card remains a focusable native button. opacity: 0 and pointerEvents: 'none' do not remove an inactive button from the tab order. Keyboard users can focus and activate cards that are not visible.

Synchronize the active card state with the animation. Set inactive cards to tabIndex={-1} and hide them from assistive technology. Pause or preserve the active card while it has focus.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/apps/console/src/features/home/components/FrameworkFlipCard.tsx`
around lines 76 - 101, Update the framework cards rendered by the frameworks.map
loop to derive active state from the animation and set inactive buttons to
tabIndex={-1} with aria-hidden, while keeping the active card
keyboard-focusable. Ensure the animation does not hide or advance away from a
card while it has focus.

Comment on lines +111 to +129
<Box
onClick={goToApplicationList}
sx={{
display: 'flex',
alignItems: 'center',
gap: 0.25,
color: 'primary.light',
cursor: 'pointer',
whiteSpace: 'nowrap',
}}
>
<Typography variant="body2" color="inherit">
{t('start_building.hero.status.app_count', {
count: totalApps,
defaultValue: '{{count}} application',
})}
</Typography>
<ArrowRight size={16} />
</Box>

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.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Use a semantic control for the application-count action.

At Line 111, this Box only handles pointer clicks. Keyboard users cannot focus it or activate the application-list navigation.

Use a Button or link component that calls goToApplicationList. Preserve the current inline styling on that semantic control.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@frontend/apps/console/src/features/home/components/StartBuildingSection.tsx`
around lines 111 - 129, Replace the clickable Box in the application-count
action with a semantic Button or link that invokes goToApplicationList and
supports keyboard activation. Preserve the existing inline layout, color,
spacing, cursor, and nowrap styling on the new control, while keeping the
Typography content and ArrowRight indicator unchanged.

@brionmario brionmario added trigger-pr-builder Add when the PR is ready for CI; starts the PR Builder for this and all later pushes Type/Bug and removed trigger-pr-builder Add when the PR is ready for CI; starts the PR Builder for this and all later pushes Type/Improvement labels Aug 6, 2026
@codecov

codecov Bot commented Aug 6, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@brionmario
brionmario force-pushed the home-page-integration-banner branch from ab72548 to d818e30 Compare August 6, 2026 07:16
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

DonOmalVindula
DonOmalVindula previously approved these changes Aug 6, 2026
Replaces the scrolling background logo decoration with a compact,
responsive SDK flip-card widget that cycles through ThunderID's
supported frameworks and links to their application templates.
Also aligns the "Add Users" quick-link card's avatars with the same
photo-or-initials rendering used on the Users list page.
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@brionmario
brionmario enabled auto-merge August 6, 2026 08:18

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@frontend/apps/console/src/features/home/components/__tests__/FrameworkFlipCard.test.tsx`:
- Around line 47-51: Update the FrameworkFlipCard navigation assertion to import
and use RouteConfig.applications.types() when constructing the expected route
prefix, replacing the hardcoded "/applications/types" literal while preserving
the selected template query matching.
- Around line 37-45: Update the FrameworkFlipCard tests to target a stable
selector for individual slots, then assert the exact expected default slot count
in the default-render test and exactly one matching slot when slotCount={1}.
Ensure the selector identifies only slot elements rather than generic nested
divs.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: d06f1683-bb2e-4467-8df6-4754380356eb

📥 Commits

Reviewing files that changed from the base of the PR and between 9a568ae and bf3d34c.

📒 Files selected for processing (12)
  • frontend/apps/console/src/features/home/components/FrameworkFlipCard.tsx
  • frontend/apps/console/src/features/home/components/HomeFloatingLogos.tsx
  • frontend/apps/console/src/features/home/components/NextStepsSection.tsx
  • frontend/apps/console/src/features/home/components/StartBuildingSection.tsx
  • frontend/apps/console/src/features/home/components/__tests__/FrameworkFlipCard.test.tsx
  • frontend/apps/console/src/features/home/components/__tests__/HomeFloatingLogos.test.tsx
  • frontend/apps/console/src/features/home/components/__tests__/StartBuildingSection.test.tsx
  • frontend/apps/console/src/features/home/components/cards/HomeNextStepCard.tsx
  • frontend/apps/console/src/features/home/components/cards/InviteMembersCard.tsx
  • frontend/apps/console/src/features/home/components/cards/__tests__/InviteMembersCard.test.tsx
  • frontend/packages/configure-users/src/index.ts
  • frontend/packages/i18n/src/locales/en-US.ts
💤 Files with no reviewable changes (2)
  • frontend/apps/console/src/features/home/components/HomeFloatingLogos.tsx
  • frontend/apps/console/src/features/home/components/tests/HomeFloatingLogos.test.tsx
🚧 Files skipped from review as they are similar to previous changes (8)
  • frontend/packages/configure-users/src/index.ts
  • frontend/packages/i18n/src/locales/en-US.ts
  • frontend/apps/console/src/features/home/components/cards/HomeNextStepCard.tsx
  • frontend/apps/console/src/features/home/components/cards/InviteMembersCard.tsx
  • frontend/apps/console/src/features/home/components/NextStepsSection.tsx
  • frontend/apps/console/src/features/home/components/tests/StartBuildingSection.test.tsx
  • frontend/apps/console/src/features/home/components/StartBuildingSection.tsx
  • frontend/apps/console/src/features/home/components/FrameworkFlipCard.tsx

Comment on lines +37 to +45
it('renders the default number of slots', () => {
render(<FrameworkFlipCard />);
expect(screen.getAllByRole('button').length).toBeGreaterThan(0);
});

it('renders only a single slot when slotCount is 1', () => {
const {container} = render(<FrameworkFlipCard slotCount={1} />);
expect(container.querySelectorAll(':scope > div > div').length).toBeGreaterThan(0);
});

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.

📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Assert the slot count exactly.

Both assertions only verify that at least one element renders. They pass if the default count changes or if slotCount={1} still renders multiple slots. Add a stable slot selector and assert the expected default count and exactly one slot.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@frontend/apps/console/src/features/home/components/__tests__/FrameworkFlipCard.test.tsx`
around lines 37 - 45, Update the FrameworkFlipCard tests to target a stable
selector for individual slots, then assert the exact expected default slot count
in the default-render test and exactly one matching slot when slotCount={1}.
Ensure the selector identifies only slot elements rather than generic nested
divs.

Comment on lines +47 to +51
it('navigates to the application types page with the selected template on click', () => {
render(<FrameworkFlipCard />);
const buttons = screen.getAllByRole('button');
fireEvent.click(buttons[0]);
expect(mockNavigate).toHaveBeenCalledWith(expect.stringMatching(/^\/applications\/types\?type=.+/));

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Resolve the expected route through RouteConfig.

The literal route duplicates the configured destination. Import RouteConfig and build the expected navigation prefix from RouteConfig.applications.types() so this test changes with the route configuration.

As per coding guidelines, "Never hardcode route paths in frontend app code."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@frontend/apps/console/src/features/home/components/__tests__/FrameworkFlipCard.test.tsx`
around lines 47 - 51, Update the FrameworkFlipCard navigation assertion to
import and use RouteConfig.applications.types() when constructing the expected
route prefix, replacing the hardcoded "/applications/types" literal while
preserving the selected template query matching.

Source: Coding guidelines

@brionmario
brionmario added this pull request to the merge queue Aug 6, 2026
Merged via the queue into thunder-id:main with commit a4311a0 Aug 6, 2026
29 of 46 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

trigger-pr-builder Add when the PR is ready for CI; starts the PR Builder for this and all later pushes Type/Bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Polish visual issues on the Console Home Page

2 participants