TheDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/nicolasgrajaleshoyos/portafolio/llms.txt
Use this file to discover all available pages before exploring further.
About component occupies the second section of the portfolio (id #about) and gives visitors a personal introduction to Nicolas Grajales Hoyos. It is divided into two visual areas: a left-side profile photo with a floating animation and a rotated colour tint panel, paired with a bio text column on the right, and below them an 18-tile skills grid that reveals itself with a staggered entrance animation as the section scrolls into view.
Props
About accepts no external props. The bio copy, profile image path, and full skills list are all defined as module-level constants inside the component file.
Behavior
Visibility via IntersectionObserver
A useRef is attached to the outer <section> element. An IntersectionObserver configured with threshold: 0.1 sets isVisible to true the first time 10 % of the section enters the viewport, then immediately unobserves the target so the animation only fires once. The isVisible flag drives:
- Section opacity —
opacity-0→opacity-100viatransition-opacity duration-1000. - Individual skill card opacity and translateY — each card is hidden (
opacity: 0, translateY: 20px) untilisVisibleis true, at which point the inline styles switch toopacity: 1, translateY: 0.
Skills grid layout
The 18 skill tiles are arranged in a responsive grid that increases column count as the viewport widens:Staggered skill card animation
The skills are rendered via.map(), and each card receives a transitionDelay proportional to its index:
Profile image
The photo is served from thepublic/icons/ directory at the path /icons/2.jpg. It sits inside a relative container that also renders a rotated bg-primary/20 background panel. The parent group container pauses the CSS float animation on hover:
Skills Data
The full list of 18 skills is defined as a typed array at module level. Icons come from a mixture of custom SVG wrappers (@/components/Icons/SkillIcons) and the react-icons library:
Skill interface is defined in src/types.ts:
Usage Example
About is rendered inside <main> in App.tsx, directly after <Hero />:
Customization
Adding a new skill
Adding a new skill
- Import the icon from
react-iconsor create a custom wrapper in@/components/Icons/SkillIcons. - Add a new entry to the
skillsarray:
Removing a skill
Removing a skill
Delete the corresponding object from the
skills array. The remaining tiles reflow in the responsive grid and their stagger delays recalculate automatically.Changing the profile photo
Changing the profile photo
Replace
/icons/2.jpg in the public/icons/ directory with your new image, keeping the same filename, or update the src attribute in the <img> tag:Editing the bio text
Editing the bio text
The two bio paragraphs are hardcoded
<p> elements inside the lg:col-span-3 div. Edit their text content directly in About.tsx to update the personal introduction.Adjusting the stagger delay
Adjusting the stagger delay
Change the multiplier in the
transitionDelay inline style to speed up or slow down the cascade: