Skip to content

feat(skills): redesign section with compact cards and detail modal - #68

Merged
GMNAPI merged 2 commits into
masterfrom
feature/skills-card-modal-redesign
Mar 12, 2026
Merged

feat(skills): redesign section with compact cards and detail modal#68
GMNAPI merged 2 commits into
masterfrom
feature/skills-card-modal-redesign

Conversation

@GMNAPI

@GMNAPI GMNAPI commented Mar 12, 2026

Copy link
Copy Markdown
Owner

Summary

  • Applies the same two-level card→modal pattern already used in Projects to the Skills section
  • New SkillCard component: icon + name + experience badge + 2-line summary + first 3 skill pills + overflow badge; hover overlay reveals all skills with usage bars
  • New SkillModal component: full skill details (description, usage bar, experience years, project count, keywords) using the shared Modal primitive
  • Skills.tsx refactored: inline article list replaced with <SkillCard> + <SkillModal> driven by selectedCategory state
  • Fixes latent bug: leadership category id added to SkillCategory type and CATEGORY_ICONS map
  • Adds skills.aria.openCategory and skills.aria.closeModal i18n keys (ES + EN)

Test plan

  • 263/263 tests pass (npm run test:run)
  • TypeScript clean (tsc --noEmit --skipLibCheck)
  • New SkillCard.test.tsx — 10 tests: render, overflow pills, hover overlay content, click handler, accessibility
  • New SkillModal.test.tsx — 14 tests: null render, content, close via button/ESC/backdrop
  • Updated Skills.test.tsx — skill descriptions hidden in cards, visible after click, modal closes on ESC, donut chart + localization intact

Apply the same two-level pattern as Projects: compact SkillCard (icon +
summary + first 3 skill pills + hover overlay with usage bars) opens a
SkillModal with full skill metadata (description, years, projects,
keywords). Adds `leadership` id to SkillCategory type and fixes the
missing icon. 263 tests pass.
@vercel

vercel Bot commented Mar 12, 2026

Copy link
Copy Markdown

Deployment failed with the following error:

There is no GitHub account connected to this Vercel account.

@vercel

vercel Bot commented Mar 12, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
desenvolupadormaster Ready Ready Preview, Comment Mar 12, 2026 10:22am

@gemini-code-assist

Copy link
Copy Markdown

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the user experience of the Skills section by introducing a modern, interactive design. It transitions from a static list to a dynamic card-and-modal system, allowing users to quickly grasp an overview of skill categories and then delve into detailed information on demand. This change not only improves visual appeal and navigability but also standardizes the UI pattern across the portfolio, making it more cohesive and accessible.

Highlights

  • UI Redesign for Skills Section: Redesigned the Skills section UI to adopt a two-level card-to-modal pattern, mirroring the Projects section for consistency.
  • New SkillCard Component: Introduced a new SkillCard component for a compact display of skill categories, featuring an icon, name, experience badge, summary, and a limited number of skill pills with an overflow indicator.
  • New SkillModal Component: Implemented a new SkillModal component to present comprehensive skill details, including descriptions, usage bars, experience years, project counts, and keywords, utilizing a shared Modal primitive.
  • Skills.tsx Refactoring: Refactored the Skills.tsx component to integrate the new SkillCard and SkillModal components, managing the display of skill details through a selectedCategory state.
  • Bug Fix: Leadership Category: Corrected a latent bug by adding the leadership category ID to the SkillCategory type and the CATEGORY_ICONS map, ensuring proper categorization.
  • Accessibility Enhancements: Added new internationalization (i18n) keys, skills.aria.openCategory and skills.aria.closeModal, for improved accessibility in both English and Spanish.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • apps/portfolio/messages/en.json
    • Added new ARIA accessibility keys for opening skill categories and closing modals.
  • apps/portfolio/messages/es.json
    • Added new ARIA accessibility keys for opening skill categories and closing modals, localized in Spanish.
  • apps/portfolio/src/features/skills/Skills.tsx
    • Refactored the main Skills component to remove inline rendering of skill details, imported SkillCard and SkillModal, and introduced useState to manage the currently selected skill category for modal display.
  • apps/portfolio/src/features/skills/components/SkillCard.tsx
    • Created a new component to display a compact summary of a skill category, including an icon, name, experience, a truncated summary, and up to three skill pills with an overflow indicator, and a hover overlay for usage bars.
  • apps/portfolio/src/features/skills/components/SkillModal.tsx
    • Created a new component to display detailed information about a selected skill category within a modal, including all skills, their descriptions, usage percentages, experience, projects, and keywords.
  • apps/portfolio/src/shared/constants/skills.ts
    • Updated the SkillCategory interface to include 'leadership' as a valid category ID.
  • apps/portfolio/tests/features/skills/Skills.test.tsx
    • Updated the Skills section tests to reflect the new component structure, focusing on card display, modal opening/closing, and localization, while removing tests for the old inline skill rendering.
  • apps/portfolio/tests/features/skills/components/SkillCard.test.tsx
    • Added new unit tests for the SkillCard component, covering rendering of category details, skill pills, overflow badge, hover overlay, click interaction, and accessibility.
  • apps/portfolio/tests/features/skills/components/SkillModal.test.tsx
    • Added new unit tests for the SkillModal component, verifying rendering of skill details, handling of null categories, and various methods of closing the modal (button, Escape key, backdrop click).
Activity
  • All 263 tests passed.
  • TypeScript compilation was clean with no errors.
  • New SkillCard.test.tsx was added with 10 tests covering rendering, overflow pills, hover overlay, click handler, and accessibility.
  • New SkillModal.test.tsx was added with 14 tests covering null render, content display, and closing mechanisms.
  • Skills.test.tsx was updated to reflect the new component structure, ensuring skill descriptions are hidden in cards, visible after click, modal closes on ESC, and donut chart + localization remain intact.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Code Review

This pull request effectively redesigns the skills section by introducing a clean, component-based architecture with SkillCard and SkillModal. The new card-to-modal pattern improves user experience by presenting information in a more organized and digestible way. The code is well-structured, and the addition of comprehensive tests for the new components is commendable. I have one minor suggestion regarding internationalization to further improve the implementation.

</li>
))}
</ul>
<p className="text-xs text-accent font-mono text-right shrink-0">Ver detalles →</p>

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

medium

The text 'Ver detalles →' is hardcoded in Spanish. To ensure it's translated for other locales, it should be internationalized using the useTranslations hook.

I recommend adding a labels object to the skills section in your message files, similar to how it's done for the projects section.

messages/en.json:

"skills": {
  ...
  "labels": {
    "viewDetails": "View details →"
  },
  "aria": { ... }
}

messages/es.json:

"skills": {
  ...
  "labels": {
    "viewDetails": "Ver detalles →"
  },
  "aria": { ... }
}

Then you can use t('labels.viewDetails') in the component.

Suggested change
<p className="text-xs text-accent font-mono text-right shrink-0">Ver detalles →</p>
<p className="text-xs text-accent font-mono text-right shrink-0">{t('labels.viewDetails')}</p>

@GMNAPI
GMNAPI merged commit b4f3717 into master Mar 12, 2026
7 of 9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant