Skip to content

Conversation

Nehemimosqueda520
Copy link

@Nehemimosqueda520 Nehemimosqueda520 commented Aug 4, 2025

Summary by CodeRabbit

  • New Features

    • Added Technologies and Certificates sections; revamped Projects with new items, links and updated nav/hero content.
    • Contact form migrated to Formspree with required fields and reCAPTCHA; CV and contact links updated.
  • Style

    • New theme color, centered layouts, refined hero typography, enhanced styles and hover/transition effects for services, technologies, and certificates.
    • Adjusted on-scroll reveal animations.
  • Documentation

    • New README with project overview, SEO guidance, setup, and contribution instructions.
  • Chores

    • Added workspace configuration for development tools; removed legacy slider/carousel feature.

Update contact section with new form
…s-section-with-icons

Add certificates section
…ction-with-service-cards

Update services section with service packages
Copy link

coderabbitai bot commented Aug 22, 2025

Walkthrough

Adds a workspace VS Code settings file, a new README, large HTML content and metadata updates (new sections, projects, Formspree contact with reCAPTCHA script), substantial CSS for new sections and a theme color change, and JS updates including const refactors, ScrollReveal expansion, and removal of Swiper.

Changes

Cohort / File(s) Summary
Workspace Config
\.vscode/settings.json
Adds workspace VS Code settings with CodeGPT.apiKey set to "CodeGPT Plus Beta".
Documentation
README.md
New README describing the portfolio, project structure, SEO/Open Graph notes, Formspree + Google reCAPTCHA guidance, usage and contribution instructions.
Markup & Content
index.html
Major content/structure overhaul: updated title, favicon, metadata/OG, canonical URL; renamed/added sections (About Me / aboutMe, Technologies, Certificates, Projects); updated hero, social links, CV/Cover Letter downloads; new Services, Technologies and Certificates sections; Projects updates; removed Testimonials; Contact form migrated to Formspree and includes Google reCAPTCHA script; updated images/alt text and links.
Styles
css/style.css
Theme color changed (--main-color from #754ef9#8b1414), global/hero typography tweaks, and extensive new styles for Services, Technologies, and Certificates (flex layouts, hover effects, sizing, transitions).
Scripts
js/script.js
DOM refs converted from letconst (menuIcon, navbar, sections, navLinks, header); removed Swiper initialization; ScrollReveal targets expanded to include technologies and certificates; re-added/right-origin reveal for some home/about elements.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant Browser as Portfolio Site
  participant reCAPTCHA as Google reCAPTCHA
  participant Formspree as Formspree

  User->>Browser: Fill contact form
  Browser->>reCAPTCHA: Load widget (script in page)
  User->>reCAPTCHA: Complete CAPTCHA (optional)
  reCAPTCHA-->>Browser: (token available in page)

  User->>Browser: Submit form
  Browser->>Formspree: POST form data (may include token if form includes it)
  Formspree-->>Browser: Response (success/failure)
  Browser-->>User: Show result
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

I thump my paws on fresh HTML,
New hues in CSS begin to swell.
Scripts now tidy, Swiper hops away,
Forms post onward in the light of day.
Certs and techs parade—hop, hop, hooray! 🐇✨

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@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: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
css/style.css (1)

1077-1079: Don’t globally round every image. Scope the style.

Global border-radius can distort logos, icons, and screenshots. Scope to content images instead.

Apply this diff:

-img {
-    border-radius: 20px;
-}
+.rounded {
+    border-radius: 20px;
+}

Then add class="rounded" to intended images in index.html (see suggested diffs there).

js/script.js (1)

23-27: Guard against missing anchors when updating active link.

querySelector may return null if the href doesn’t exist or IDs change. Add a guard to avoid a runtime error.

Apply this diff:

-                links.classList.remove('active');
-                document.querySelector('header nav a[href*=' + id + ']').classList.add('active');
+                links.classList.remove('active');
+                const activeLink = document.querySelector(`header nav a[href*="${id}"]`);
+                if (activeLink) activeLink.classList.add('active');
🧹 Nitpick comments (22)
README.md (3)

24-31: Minor casing and terminology fixes (Spanish).

Standardize technology names and headings (JavaScript, CSS, Open Graph) for polish.

Apply this diff:

-- **Swiper**: Librería JavaScript para crear sliders/carousels.
-- **Boxicons**: Conjunto de iconos utilizados para redes sociales y servicios.
+- **Swiper**: Librería JavaScript para sliders/carousels.
+- **Boxicons**: Set de íconos para redes sociales y servicios.
@@
-## Optimización para Motores de Búsqueda (SEO)
+## Optimización para motores de búsqueda (SEO)
@@
-El sitio incorpora metadatos descriptivos y etiquetas Open Graph para mejorar la visibilidad en buscadores y redes sociales.
+El sitio incorpora metadatos descriptivos y etiquetas Open Graph para mejorar la visibilidad en buscadores y redes sociales.

34-36: Style: avoid “realizar” as a comodín verb.

More concise Spanish reads better here.

Apply this diff:

-El código es público y puede ser utilizado o modificado. Para contribuir, hacer un fork, realizar cambios y enviar un pull request.
+El código es público y puede ser utilizado o modificado. Para contribuir, haz un fork, propone cambios y envía un pull request.

40-45: Clarify reCAPTCHA/Formspree integration steps.

Note that reCAPTCHA requires server-side verification (handled by Formspree), and site keys are public. Add a note to rotate keys only if secret keys are exposed elsewhere.

Proposed addition:

 Se ha incorporado Google reCAPTCHA para prevenir el spam. Registra tu dominio y reemplaza el valor de `data-sitekey` en `index.html` por tu clave de sitio.
+
+Formspree valida el token de reCAPTCHA en el servidor. Asegúrate de:
+- Usar el dominio correcto en la configuración de reCAPTCHA.
+- Mantener privada la clave secreta del servidor (nunca subirla al repositorio).
+- Verificar que el formulario responde con 200 OK en Formspree tras resolver el CAPTCHA.
css/style.css (4)

138-144: Heading spacing changes — check for overflow on very small screens.

The added line-height and top margin can clip in <=315px breakpoints for long names. Consider reducing line-height at the 315px media query.

Sample tweak in the smallest breakpoint:

 @media (max-width: 315px) {
   .home-content h1 {
-        font-size: 4.5rem;
+        font-size: 4.2rem;
+        line-height: 1.1;
   }
 }

438-442: Define transitions on the base element, not on :hover.

Place transition on .technology-box so it animates both enter and exit.

Apply this diff:

-.technologies-container .technology-box:hover {
-     box-shadow: 0 .1rem 2rem var(--shadow-color);
-    transform: scale(1.02);
-    transition: .5s ease;
-}
+.technologies-container .technology-box {
+    transition: transform .3s ease, box-shadow .3s ease;
+}
+.technologies-container .technology-box:hover {
+    box-shadow: 0 .1rem 2rem var(--shadow-color);
+    transform: scale(1.02);
+}

366-369: Keyboard accessibility parity with hover effects.

Mirror hover visuals for keyboard users via :focus-within.

Apply this diff:

 .services-container .services-box:hover {
     box-shadow: 0 .1rem 2rem var(--shadow-color);
     transform: scale(1.02);
 }
+.services-container .services-box:focus-within {
+    box-shadow: 0 .1rem 2rem var(--shadow-color);
+    transform: scale(1.02);
+    outline: 2px solid var(--main-color);
+    outline-offset: 2px;
+}

 .certificates-container .certificates-box:hover {
     box-shadow: 0 .1rem 2rem var(--shadow-color);
     transform: scale(1.02);
 }
+.certificates-container .certificates-box:focus-within {
+    box-shadow: 0 .1rem 2rem var(--shadow-color);
+    transform: scale(1.02);
+    outline: 2px solid var(--main-color);
+    outline-offset: 2px;
+}

Also applies to: 499-502


597-600: Ensure link focus is visible over the image overlay.

Apply this diff:

 .portfolio-layer a {
     display: inline-flex;
@@
     border-radius: 50%;
 }
+.portfolio-layer a:focus-visible {
+    outline: 3px solid var(--white-color);
+    outline-offset: 3px;
+}
js/script.js (6)

32-35: Avoid querying the header on every scroll.

Cache the header element once; only toggle classes on scroll.

Apply this diff here:

-const header = document.querySelector('.header');
-header.classList.toggle('sticky', window.scrollY > 100);
+header.classList.toggle('sticky', window.scrollY > 100);

And add this near the top of the file (outside the scroll handler):

const header = document.querySelector('.header');

38-41: Unconditionally collapsing the menu on any scroll may be jarring.

Consider collapsing only when the user scrolls past a threshold or when the navbar is open and the user clicks a link.

Possible tweak:

-if (navbar.classList.contains('active')) {
-  menuIcon.classList.remove('bx-x');
-  navbar.classList.remove('active');
-}
+if (navbar.classList.contains('active') && window.scrollY > 100) {
+  menuIcon.classList.remove('bx-x');
+  navbar.classList.remove('active');
+}

45-58: Use const instead of var for Swiper instance.

For consistency and to avoid accidental reassignments.

Apply this diff:

-var swiper = new Swiper(".mySwiper", {
+const swiper = new Swiper(".mySwiper", {

62-67: Use const for darkModeIcon.

It’s not reassigned.

Apply this diff:

-let darkModeIcon = document.querySelector('#darkMode-icon');
+const darkModeIcon = document.querySelector('#darkMode-icon');

79-82: Remove ScrollReveal target for .testimonial-wrapper (section removed).

Avoid selecting non-existent elements.

Apply this diff:

-ScrollReveal().reveal('.home-img img, .services-container, .technologies-container, .certificates-container, .portfolio-box, .testimonial-wrapper, .contact form', { origin: 'bottom' });
+ScrollReveal().reveal('.home-img img, .services-container, .technologies-container, .certificates-container, .portfolio-box, .contact form', { origin: 'bottom' });

83-95: Replace alert with an inline, accessible error message.

Alerts are disruptive and not screen‑reader friendly. Show an inline message and focus it.

Example patch (JS):

-            if (response.length === 0) {
-                e.preventDefault();
-                alert('Please complete the CAPTCHA before submitting.');
-            }
+            if (response.length === 0) {
+                e.preventDefault();
+                const msg = document.getElementById('captcha-error') || Object.assign(document.createElement('p'), { id: 'captcha-error' });
+                msg.textContent = 'Please complete the CAPTCHA before submitting.';
+                msg.style.color = 'var(--main-color)';
+                const widget = contactForm.querySelector('.g-recaptcha');
+                widget?.after(msg);
+                msg.setAttribute('tabindex', '-1');
+                msg.focus();
+            }

And add an empty placeholder below the widget in index.html for better layout (see related HTML suggestion).

index.html (9)

9-18: SEO: add og:url and make og:image absolute.

Open Graph scrapers expect absolute URLs. Also include og:url that matches the canonical.

Apply this diff:

-    <meta property="og:image" content="images/home.png">
+    <meta property="og:image" content="https://portfolio-nehemias.netlify.app/images/home.png">
+    <meta property="og:url" content="https://portfolio-nehemias.netlify.app/">

33-41: Sync nav label with section heading (“Projects”), and improve accessibility.

  • Rename “Portfolio” to “Projects” for consistency with the H2.
  • Add aria attributes for the menu icon and link relationships.

Apply this diff:

-            <a href="#portfolio">Portfolio</a>
+            <a href="#portfolio">Projects</a>
@@
-        <div class="bx bx-menu" id="menu-icon"></div>
+        <div class="bx bx-menu" id="menu-icon" role="button" aria-label="Toggle navigation" aria-controls="navbar" aria-expanded="false"></div>

And give the nav an id to match aria-controls:

-        <nav class="navbar">
+        <nav id="navbar" class="navbar">

51-59: Polish copy in hero; fix casing and grammar.

Minor grammar/casing issues (CSS, C#, React).

Apply this diff:

-            <h3>Hi! I am</h3>
+            <h3>Hi! I am</h3>
             <h1 class="title">Nehemías Mosqueda</h1>
             <p>
-                I am a passionate about programming that specializes the most in languages like 
-                HTML, css, JavaScript, C #, react, etc. 
+                I am passionate about programming, with a focus on
+                HTML, CSS, JavaScript, C#, React, and more.
             </p>
-            <p>Lately I am in the third year of the Bachelor's degree of Video Game Production and Digital Entertainment
-                 at the National University of Rafaela (UNRaf).</p>
+            <p>I am currently in the third year of the Bachelor’s Degree in Video Game Production and Digital Entertainment
+               at the National University of Rafaela (UNRaf).</p>

84-86: Casing: “Other languages” → “Other Languages”.

Apply this diff:

-                    <h3>other languages</h3>
+                    <h3>Other Languages</h3>

128-158: Services content: fix typos and spacing; standardize terminology.

  • “Funcional” → “Functional”.
  • “Javascript” → “JavaScript”.
  • Ensure a space after “Technologies:”.

Apply this diff:

-                <p>
-Funcional Website (3-5 Pages)
-</p>
+                <p>Functional Website (3–5 pages)</p>
@@
-                    <li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
+                    <li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>
@@
-                    <li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
+                    <li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>

250-316: Performance: lazy-load offscreen images in Projects.

Add loading="lazy" to portfolio thumbnails to reduce initial payload.

Apply this diff across project images:

-                <img src="images/portada.png" alt="Screenshot of SpaceTrip web game">
+                <img src="images/portada.png" alt="Screenshot of SpaceTrip web game" loading="lazy">
@@
-                <img src="images/portada2.png" alt="Screenshot of Deep Ambition game">
+                <img src="images/portada2.png" alt="Screenshot of Deep Ambition game" loading="lazy">
@@
-                <img src="images/sun.png" alt="Icon of ClimAPP weather app">
+                <img src="images/sun.png" alt="Icon of ClimAPP weather app" loading="lazy">
@@
-                <img src="images/drumPad.png" alt="Screenshot of Drum Pad Machine web app">
+                <img src="images/drumPad.png" alt="Screenshot of Drum Pad Machine web app" loading="lazy">
@@
-                <img src="images/calculator.png" alt="Screenshot of Calculator web app">
+                <img src="images/calculator.png" alt="Screenshot of Calculator web app" loading="lazy">
@@
-                <img src="images/markdown.png" alt="Screenshot of Markdown Previewer web app">
+                <img src="images/markdown.png" alt="Screenshot of Markdown Previewer web app" loading="lazy">

322-336: Form: consider dynamic reCAPTCHA theming and inline error placeholder.

  • Add a placeholder for inline CAPTCHA errors (to pair with the JS change).
  • Optionally set data-theme to match dark mode.

Apply this diff:

-            <div class="g-recaptcha" data-sitekey="6LdRJ5QrAAAAAO1MX3IcZSKRzr9ss2f1ZYFz35dO"></div>
+            <div class="g-recaptcha" data-sitekey="6LdRJ5QrAAAAAO1MX3IcZSKRzr9ss2f1ZYFz35dO" data-theme="light"></div>
+            <p id="captcha-error" aria-live="polite"></p>

Optional: toggle data-theme when dark mode is enabled.


341-349: Footer year is stale (2023).

Update to the current year or render dynamically.

Apply this diff:

-            <p>Copyright &copy; 2023 | All Rights Reserved.</p>
+            <p>Copyright &copy; 2025 | All Rights Reserved.</p>

Or inject the year via JS if preferred.


94-95: Scope image rounding to a class (matches CSS suggestion).

If you adopt the CSS change to .rounded, add the class to intended images for consistent styling.

Apply this diff (examples):

-            <img src="images/home.png" alt="Portrait of Nehemías Mosqueda">
+            <img src="images/home.png" alt="Portrait of Nehemías Mosqueda" class="rounded">
@@
-            <img src="images/about.png" alt="Illustration representing Nehemías Mosqueda">
+            <img src="images/about.png" alt="Illustration representing Nehemías Mosqueda" class="rounded">
@@
-                <img src="images/portada.png" alt="Screenshot of SpaceTrip web game" loading="lazy">
+                <img src="images/portada.png" alt="Screenshot of SpaceTrip web game" loading="lazy" class="rounded">

(Repeat class="rounded" for other project images as desired.)

Also applies to: 101-102, 250-251, 262-263, 274-275, 284-285, 296-297, 307-308

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 54cdbc6 and 57aef2e.

⛔ Files ignored due to path filters (11)
  • documents/coverletter.pdf is excluded by !**/*.pdf
  • documents/curriculum.pdf is excluded by !**/*.pdf
  • images/about.png is excluded by !**/*.png
  • images/calculator.png is excluded by !**/*.png
  • images/drumPad.png is excluded by !**/*.png
  • images/favicon.png is excluded by !**/*.png
  • images/home.png is excluded by !**/*.png
  • images/markdown.png is excluded by !**/*.png
  • images/portada.png is excluded by !**/*.png
  • images/portada2.png is excluded by !**/*.png
  • images/sun.png is excluded by !**/*.png
📒 Files selected for processing (5)
  • .vscode/settings.json (1 hunks)
  • README.md (1 hunks)
  • css/style.css (5 hunks)
  • index.html (5 hunks)
  • js/script.js (4 hunks)
🧰 Additional context used
🪛 LanguageTool
README.md

[typographical] ~5-~5: Mayúsculas y minúsculas recomendadas.
Context: ...ontactar a Nehemías. ## Estructura del Código - index.html: Archivo principal qu...

(AI_ES_GGEC_REPLACEMENT_CASING_UPPERCASE)


[uncategorized] ~10-~10: Probablemente hay un error. Considere aplicar la sugerencia.
Context: ...nalidades adicionales al sitio web. - images: Carpeta con imágenes utilizadas en el ...

(AI_ES_GGEC_REPLACEMENT_OTHER)


[typographical] ~13-~13: Mayúsculas y minúsculas recomendadas.
Context: ...ación en formato PDF. ## Secciones del Sitio Web - Inicio (Home): Presentación de N...

(AI_ES_GGEC_REPLACEMENT_CASING_UPPERCASE)


[uncategorized] ~15-~15: Probablemente falta un determinante.
Context: ...electrónico y GitHub. Botón de descarga de currículum. - Sobre Mí (About): Bre...

(AI_ES_GGEC_MISSING_DETERMINER)


[typographical] ~16-~16: Mayúsculas y minúsculas recomendadas.
Context: ...ón de descarga de currículum. - Sobre Mí (About): Breve información personal, ...

(AI_ES_GGEC_REPLACEMENT_CASING_UPPERCASE)


[typographical] ~23-~23: Mayúsculas y minúsculas recomendadas.
Context: ...egreso al inicio. ## Recursos Externos Utilizados - Swiper: Librería JavaScript para...

(AI_ES_GGEC_REPLACEMENT_CASING_UPPERCASE)


[typographical] ~32-~32: Mayúsculas y minúsculas recomendadas.
Context: ...bilidad y el posicionamiento. ## Uso y Contribución El código es público y puede ser utili...

(AI_ES_GGEC_REPLACEMENT_CASING_UPPERCASE)


[style] ~34-~34: Se recomienda emplear una alternativa al verbo comodín ‘realizar’.
Context: ...ficado. Para contribuir, hacer un fork, realizar cambios y enviar un pull request. *Not...

(REALIZAR)

🔇 Additional comments (6)
css/style.css (2)

211-213: Centering rotating labels — nice touch.


17-17: Contrast Verification Results

The contrast script shows:

  • White (#ffffff) on #8b1414: 9.51:1 (meets WCAG AAA for normal text)
  • Near-white (#fdfdfd) on #8b1414: 9.35:1 (meets WCAG AAA for normal text)
  • Dark gray (#333333) on #8b1414: 1.33:1 (fails WCAG AA/AAA)

The only failing combination is any text rendered in #333333 against the new main color. Please update all components that currently use #333333 on a #8b1414 background—specifically:

  • Buttons
  • Footer text
  • Overlay captions

to use a high-contrast color (e.g. white #ffffff or near-white #fdfdfd).

js/script.js (2)

2-3: Good: const-ify static DOM references.


12-14: Prefer const for NodeList references too (already done) — LGTM.

index.html (2)

167-209: Technologies section: nice breadth and custom D3 SVG — well integrated.


352-359: Script order looks good; reCAPTCHA loaded after content.

Consider deferring custom JS too for symmetry, though it’s already at the end of body.

Comment on lines +1 to +3
{
"CodeGPT.apiKey": "CodeGPT Plus Beta"
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Remove API key from source control and workspace settings.

Committing API keys (even placeholders) is a security anti-pattern and can lead to leaks/misuse. Prefer user-level settings or environment variables; do not check secrets into the repo.

Apply this diff to stop tracking the key in the repo:

-{
-    "CodeGPT.apiKey": "CodeGPT Plus Beta"
-}
+{
+  // Intentionally omit API keys from workspace.
+  // Configure the extension via user settings or env vars on each dev machine.
+}

Optionally add this to .gitignore at repo root to prevent future commits:

.vscode/settings.json
📝 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
{
"CodeGPT.apiKey": "CodeGPT Plus Beta"
}
{
// Intentionally omit API keys from workspace.
// Configure the extension via user settings or env vars on each dev machine.
}
🤖 Prompt for AI Agents
.vscode/settings.json lines 1-3: Remove the API key entry from this workspace
settings file and do not commit any secrets; replace the key with a non-secret
placeholder or delete the property entirely, then save the file. Ensure the real
API key is moved to a user-level setting or an environment variable and update
any docs on how developers should configure their local environment. Finally,
add .vscode/settings.json to the repository .gitignore (at repo root) to prevent
future commits of workspace secrets.

Comment on lines +426 to +436
.technologies-container .technology-box {
flex: 1 1 30rem;
background: var(--bg-color);
padding: 3rem 2rem 4rem;
border-radius: 2rem;
box-shadow: 0 .1rem .5rem var(--shadow-color);
text-align: center;
border-top: .6rem solid var(--main-color);
border-bottom: .6rem solid var(--main-color);
height: 25rem;
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Avoid fixed heights in cards (.technology-box).

Fixed height (25rem) risks overflow with localization or additional icons. Prefer min-height and natural growth.

Apply this diff:

-.technologies-container .technology-box {
+.technologies-container .technology-box {
     flex: 1 1 30rem;
     background: var(--bg-color);
     padding: 3rem 2rem 4rem;
     border-radius: 2rem;
     box-shadow: 0 .1rem .5rem var(--shadow-color);
     text-align: center;
     border-top: .6rem solid var(--main-color);
     border-bottom: .6rem solid var(--main-color);
-    height: 25rem;
+    min-height: 25rem;
 }
📝 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
.technologies-container .technology-box {
flex: 1 1 30rem;
background: var(--bg-color);
padding: 3rem 2rem 4rem;
border-radius: 2rem;
box-shadow: 0 .1rem .5rem var(--shadow-color);
text-align: center;
border-top: .6rem solid var(--main-color);
border-bottom: .6rem solid var(--main-color);
height: 25rem;
}
.technologies-container .technology-box {
flex: 1 1 30rem;
background: var(--bg-color);
padding: 3rem 2rem 4rem;
border-radius: 2rem;
box-shadow: 0 .1rem .5rem var(--shadow-color);
text-align: center;
border-top: .6rem solid var(--main-color);
border-bottom: .6rem solid var(--main-color);
min-height: 25rem;
}
🤖 Prompt for AI Agents
In css/style.css around lines 426 to 436, the .technologies-container
.technology-box currently uses a fixed height: 25rem which can cause overflow
with translations or extra content; change this to use min-height: 25rem and
remove the fixed height so the card can grow naturally (ensure any layout
relying on equal heights switches to flex alignment or use align-items/stretch
if needed), and verify that padding and box-sizing produce the intended spacing.

Comment on lines +61 to 67
<a href="mailto: [email protected]"><i class='bx bxl-gmail'></i></a>
<a href="https://github.com/Nehemimosqueda520" target="_blank"><i class='bx bxl-github'></i></a>
<a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/" target="_blank"><i class='bx bxl-linkedin'></i></a>
</div>

<a href="#" class="btn">Download CV</a>
<a href="documents/curriculum.pdf" class="btn" download>Download CV</a>
</div>
Copy link

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Fix mailto URL, add accessible labels, and secure external links.

Remove trailing space in mailto and add rel to target="_blank" links to prevent reverse tabnabbing.

Apply this diff:

-                <a href="mailto: [email protected]"><i class='bx bxl-gmail'></i></a>
-                <a href="https://github.com/Nehemimosqueda520" target="_blank"><i class='bx bxl-github'></i></a>
-                <a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/" target="_blank"><i class='bx bxl-linkedin'></i></a>
+                <a href="mailto:[email protected]" aria-label="Email Nehemías"><i class='bx bxl-gmail'></i></a>
+                <a href="https://github.com/Nehemimosqueda520" target="_blank" rel="noopener noreferrer" aria-label="GitHub profile"><i class='bx bxl-github'></i></a>
+                <a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn profile"><i class='bx bxl-linkedin'></i></a>

Run this to find any remaining target="_blank" without rel:


🏁 Script executed:

#!/bin/bash
rg -nP '<a[^>]+target="_blank"(?![^>]*\brel=)' -C1

Length of output: 3428


Secure external links, fix mailto and add accessible labels

All target="_blank" links need rel="noopener noreferrer" to prevent reverse tabnabbing, and icon-only links need accessible labels. In index.html, update as follows:

• Lines 61–63 (contact icons)

-   <a href="mailto: [email protected]"><i class='bx bxl-gmail'></i></a>
-   <a href="https://github.com/Nehemimosqueda520" target="_blank"><i class='bx bxl-github'></i></a>
-   <a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/" target="_blank"><i class='bx bxl-linkedin'></i></a>
+   <a href="mailto:[email protected]" aria-label="Email Nehemías"><i class='bx bxl-gmail'></i></a>
+   <a href="https://github.com/Nehemimosqueda520"
+      target="_blank"
+      rel="noopener noreferrer"
+      aria-label="GitHub profile"><i class='bx bxl-github'></i></a>
+   <a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/"
+      target="_blank"
+      rel="noopener noreferrer"
+      aria-label="LinkedIn profile"><i class='bx bxl-linkedin'></i></a>

• All other external links with target="_blank" (no visible text beyond an icon, or button links) must also include rel="noopener noreferrer". Specifically, update at:
– Lines 221, 227, 233, 239: “See Certificate” buttons
– Lines 258, 269, 279, 290, 302, 313: project links with external-link icons

For example:

-   <a href="https://…/responsive-web-design" class="btn" target="_blank">See Certificate</a>
+   <a href="https://…/responsive-web-design"
+      class="btn"
+      target="_blank"
+      rel="noopener noreferrer">See Certificate</a>

And:

-   <a href="https://spacetrip-2023.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
+   <a href="https://spacetrip-2023.netlify.app"
+      target="_blank"
+      rel="noopener noreferrer"
+      aria-label="Space Trip project"><i class='bx bx-link-external'></i></a>

Please apply these changes throughout the file to ensure all external links are secure and accessible.

📝 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
<a href="mailto: [email protected]"><i class='bx bxl-gmail'></i></a>
<a href="https://github.com/Nehemimosqueda520" target="_blank"><i class='bx bxl-github'></i></a>
<a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/" target="_blank"><i class='bx bxl-linkedin'></i></a>
</div>
<a href="#" class="btn">Download CV</a>
<a href="documents/curriculum.pdf" class="btn" download>Download CV</a>
</div>
<a href="mailto:[email protected]" aria-label="Email Nehemías"><i class='bx bxl-gmail'></i></a>
<a href="https://github.com/Nehemimosqueda520"
target="_blank"
rel="noopener noreferrer"
aria-label="GitHub profile"><i class='bx bxl-github'></i></a>
<a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/"
target="_blank"
rel="noopener noreferrer"
aria-label="LinkedIn profile"><i class='bx bxl-linkedin'></i></a>
🤖 Prompt for AI Agents
In index.html around lines 61 to 67 (and additionally at lines 221, 227, 233,
239, 258, 269, 279, 290, 302, 313), fix external link security and
accessibility: remove the stray space in the mailto href (use
mailto:[email protected]), add rel="noopener noreferrer" to every anchor
that has target="_blank", and add accessible labels for icon-only links (e.g.,
include aria-label="Email", aria-label="GitHub", aria-label="LinkedIn" or
visually hidden text) so screen readers can identify them; apply the same
rel="noopener noreferrer" and aria-label pattern to all icon-only and button
links referenced on the other lines.

Comment on lines +216 to 240
<div class="certificates-container">
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>Responsive Web<br> Design</h3>
<p>Fundamentals of responsive layouts using Flexbox and Grid.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/responsive-web-design" class="btn" target="_blank">See Certificate</a>
</div>
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>JavaScript Algorithms and Data Structures</h3>
<p>Programming challenges covering modern JavaScript and data structures.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/javascript-algorithms-and-data-structures-v8" class="btn" target="_blank">See Certificate</a>
</div>
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>Front End Development Libraries</h3>
<p>Learning React, Redux and other popular front-end libraries.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/front-end-development-libraries" class="btn" target="_blank">See Certificate</a>
</div>
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>Data Visualization</h3>
<p>Building charts and graphics with D3 to create interactive visualizations.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/data-visualization" class="btn" target="_blank">See Certificate</a>
</div>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

External certificate links: add rel attributes for security.

Apply this diff (repeat pattern for all target="_blank"):

-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/responsive-web-design" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/responsive-web-design" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/javascript-algorithms-and-data-structures-v8" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/javascript-algorithms-and-data-structures-v8" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/front-end-development-libraries" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/front-end-development-libraries" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/data-visualization" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/data-visualization" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
📝 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
<div class="certificates-container">
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>Responsive Web<br> Design</h3>
<p>Fundamentals of responsive layouts using Flexbox and Grid.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/responsive-web-design" class="btn" target="_blank">See Certificate</a>
</div>
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>JavaScript Algorithms and Data Structures</h3>
<p>Programming challenges covering modern JavaScript and data structures.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/javascript-algorithms-and-data-structures-v8" class="btn" target="_blank">See Certificate</a>
</div>
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>Front End Development Libraries</h3>
<p>Learning React, Redux and other popular front-end libraries.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/front-end-development-libraries" class="btn" target="_blank">See Certificate</a>
</div>
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>Data Visualization</h3>
<p>Building charts and graphics with D3 to create interactive visualizations.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/data-visualization" class="btn" target="_blank">See Certificate</a>
</div>
<div class="certificates-container">
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>Responsive Web<br> Design</h3>
<p>Fundamentals of responsive layouts using Flexbox and Grid.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/responsive-web-design"
class="btn"
target="_blank"
rel="noopener noreferrer">
See Certificate
</a>
</div>
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>JavaScript Algorithms and Data Structures</h3>
<p>Programming challenges covering modern JavaScript and data structures.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/javascript-algorithms-and-data-structures-v8"
class="btn"
target="_blank"
rel="noopener noreferrer">
See Certificate
</a>
</div>
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>Front End Development Libraries</h3>
<p>Learning React, Redux and other popular front-end libraries.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/front-end-development-libraries"
class="btn"
target="_blank"
rel="noopener noreferrer">
See Certificate
</a>
</div>
<div class="certificates-box">
<i class='bx bxs-badge-check'></i>
<h3>Data Visualization</h3>
<p>Building charts and graphics with D3 to create interactive visualizations.</p>
<a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/data-visualization"
class="btn"
target="_blank"
rel="noopener noreferrer">
See Certificate
</a>
</div>
🤖 Prompt for AI Agents
In index.html around lines 216 to 240 the anchor tags using target="_blank" lack
rel attributes which is a security/privacy risk; update each external link
(every <a ... target="_blank">) to include rel="noopener noreferrer" to prevent
window.opener access and avoid potential tabnabbing, applying the same change to
all similar certificate links in this block (and elsewhere if present).

Comment on lines +15 to +22
- **Inicio (Home)**: Presentación de Nehemías Mosqueda con información sobre habilidades y estudios. Enlaces a perfiles de correo electrónico y GitHub. Botón de descarga de currículum.
- **Sobre Mí (About)**: Breve información personal, actitud hacia el aprendizaje y objetivo profesional.
- **Servicios (Services)**: Enumeración de servicios ofrecidos con descripciones breves.
- **Portfolio**: Muestra proyectos con imágenes, títulos y descripciones.
- **Contacto**: Formulario de contacto con campos para nombre, correo, teléfono, empresa y mensaje.
- **Contacto**: Formulario de contacto que envía los datos de manera segura a través de HTTPS utilizando el servicio [Formspree](https://formspree.io/).
- **Footer**: Información de derechos de autor y botón de regreso al inicio.

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Fix duplicated “Contacto” item and sync section names with the site.

There are two “Contacto” bullets and the list is out of sync with index.html (About Me, Technologies, Certificates, Projects).

Apply this diff to align and dedupe:

-## Secciones del Sitio Web
-
-- **Inicio (Home)**: Presentación de Nehemías Mosqueda con información sobre habilidades y estudios. Enlaces a perfiles de correo electrónico y GitHub. Botón de descarga de currículum.
-- **Sobre Mí (About)**: Breve información personal, actitud hacia el aprendizaje y objetivo profesional.
-- **Servicios (Services)**: Enumeración de servicios ofrecidos con descripciones breves.
-- **Portfolio**: Muestra proyectos con imágenes, títulos y descripciones.
-- **Contacto**: Formulario de contacto con campos para nombre, correo, teléfono, empresa y mensaje.
-- **Contacto**: Formulario de contacto que envía los datos de manera segura a través de HTTPS utilizando el servicio [Formspree](https://formspree.io/).
-- **Footer**: Información de derechos de autor y botón de regreso al inicio.
+## Secciones del Sitio Web
+
+- **Inicio (Home)**: Presentación, enlaces a correo, GitHub y LinkedIn, y botón para descargar el CV.
+- **Sobre mí (About Me)**: Breve información personal, actitud hacia el aprendizaje y objetivos.
+- **Servicios (Services)**: Paquetes y características.
+- **Tecnologías (Technologies)**: Tecnologías de Front‑end, Back‑end y Diseño.
+- **Certificados (Certificates)**: Enlaces a certificados verificados.
+- **Proyectos (Projects)**: Muestra de proyectos con imágenes, títulos y descripciones.
+- **Contacto (Contact me)**: Formulario de contacto que envía datos de forma segura mediante [Formspree](https://formspree.io/).
+- **Footer**: Derechos de autor y botón de regreso al inicio.
📝 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
- **Inicio (Home)**: Presentación de Nehemías Mosqueda con información sobre habilidades y estudios. Enlaces a perfiles de correo electrónico y GitHub. Botón de descarga de currículum.
- **Sobre Mí (About)**: Breve información personal, actitud hacia el aprendizaje y objetivo profesional.
- **Servicios (Services)**: Enumeración de servicios ofrecidos con descripciones breves.
- **Portfolio**: Muestra proyectos con imágenes, títulos y descripciones.
- **Contacto**: Formulario de contacto con campos para nombre, correo, teléfono, empresa y mensaje.
- **Contacto**: Formulario de contacto que envía los datos de manera segura a través de HTTPS utilizando el servicio [Formspree](https://formspree.io/).
- **Footer**: Información de derechos de autor y botón de regreso al inicio.
## Secciones del Sitio Web
- **Inicio (Home)**: Presentación, enlaces a correo, GitHub y LinkedIn, y botón para descargar el CV.
- **Sobre mí (About Me)**: Breve información personal, actitud hacia el aprendizaje y objetivos.
- **Servicios (Services)**: Paquetes y características.
- **Tecnologías (Technologies)**: Tecnologías de Front-end, Back-end y Diseño.
- **Certificados (Certificates)**: Enlaces a certificados verificados.
- **Proyectos (Projects)**: Muestra de proyectos con imágenes, títulos y descripciones.
- **Contacto (Contact me)**: Formulario de contacto que envía datos de forma segura mediante [Formspree](https://formspree.io/).
- **Footer**: Derechos de autor y botón de regreso al inicio.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~15-~15: Probablemente falta un determinante.
Context: ...electrónico y GitHub. Botón de descarga de currículum. - Sobre Mí (About): Bre...

(AI_ES_GGEC_MISSING_DETERMINER)


[typographical] ~16-~16: Mayúsculas y minúsculas recomendadas.
Context: ...ón de descarga de currículum. - Sobre Mí (About): Breve información personal, ...

(AI_ES_GGEC_REPLACEMENT_CASING_UPPERCASE)

🤖 Prompt for AI Agents
In README.md around lines 15 to 22, the list contains a duplicated "Contacto"
item and does not match the actual site sections; remove the duplicate
"Contacto" bullet, replace the section list so it matches index.html (About Me,
Technologies, Certificates, Projects), ensure the Contact entry describes the
secure Formspree form once, and keep Footer and other items unchanged so the
README and site nav are in sync.

Copy link

@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: 5

♻️ Duplicate comments (2)
index.html (2)

61-63: Secure external links and fix mailto spacing; add accessible labels.

This was flagged previously; it’s still outstanding.

Apply:

-                <a href="mailto: [email protected]"><i class='bx bxl-gmail'></i></a>
-                <a href="https://github.com/Nehemimosqueda520" target="_blank"><i class='bx bxl-github'></i></a>
-                <a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/" target="_blank"><i class='bx bxl-linkedin'></i></a>
+                <a href="mailto:[email protected]" aria-label="Email Nehemías"><i class='bx bxl-gmail' aria-hidden="true"></i></a>
+                <a href="https://github.com/Nehemimosqueda520" target="_blank" rel="noopener noreferrer" aria-label="GitHub profile"><i class='bx bxl-github' aria-hidden="true"></i></a>
+                <a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn profile"><i class='bx bxl-linkedin' aria-hidden="true"></i></a>

Run to find any remaining target="_blank" without rel:

#!/bin/bash
rg -nP '<a[^>]+target="_blank"(?![^>]*\brel=)' -C2

197-221: External certificate links: add rel for security.

Still missing rel="noopener noreferrer" on target="_blank" links.

-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/responsive-web-design" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/responsive-web-design" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/javascript-algorithms-and-data-structures-v8" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/javascript-algorithms-and-data-structures-v8" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/front-end-development-libraries" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/front-end-development-libraries" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/data-visualization" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/data-visualization" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
🧹 Nitpick comments (10)
js/script.js (3)

12-14: Active-link logic: harden selector and precompute lookups.

Current querySelector uses a substring match (a[href*={id}]) on every scroll; this can mis-select when IDs share substrings and does a DOM query per section per scroll tick.

  • Prefer exact hash match: a[href="#{id}"].
  • Precompute a Map from section IDs to anchor elements once.
  • Guard against a missing anchor to avoid null.classList errors on pages with partial nav.

Would you like me to provide a small refactor that builds a sectionId→link map and uses requestAnimationFrame to throttle the scroll handler?


32-35: Avoid re-querying header on every scroll.

header is queried inside the onscroll handler, so it’s re-fetched on every scroll event. Query it once at the top and reuse.

Apply this minimal change:

-/*========== sticky navbar ==========*/
-const header = document.querySelector('.header');
-header.classList.toggle('sticky', window.scrollY > 100);
+/*========== sticky navbar ==========*/
+header.classList.toggle('sticky', window.scrollY > 100);

And near the other top-level consts:

+const header = document.querySelector('.header');

47-52: Consistency: prefer const for darkModeIcon and addEventListener over property handlers.

Minor consistency/readability improvement: declare darkModeIcon with const and attach the click handler with addEventListener to avoid clobbering other potential listeners.

Proposed tweak:

-let darkModeIcon = document.querySelector('#darkMode-icon');
-darkModeIcon.onclick = () => {
+const darkModeIcon = document.querySelector('#darkMode-icon');
+darkModeIcon.addEventListener('click', () => {
     darkModeIcon.classList.toggle('bx-sun');
     document.body.classList.toggle('dark-mode');
-};
+});
index.html (7)

8-17: Meta/OG is a solid start; add og:url, absolute og:image, and Twitter card.

  • Use an absolute URL for og:image so unfurlers can fetch it.
  • Add og:url to match your canonical.
  • Add twitter:card (summary_large_image) and optionally theme-color for PWA/Android UI polish.

Apply:

-    <meta property="og:image" content="images/home.png">
+    <meta property="og:image" content="https://portfolio-nehemias.netlify.app/images/home.png">
+    <meta property="og:url" content="https://portfolio-nehemias.netlify.app/">
+    <meta name="twitter:card" content="summary_large_image">
+    <meta name="theme-color" content="#0ef">

Since Swiper was removed in JS, consider removing its CSS include on line 19 to save bytes. I can prepare a follow-up patch if you agree.


35-41: Naming consistency: “Portfolio” vs “Projects”.

The section heading shows “Projects” while the nav item says “Portfolio”. Pick one term for consistency.

For example:

-            <a href="#portfolio">Portfolio</a>
+            <a href="#portfolio">Projects</a>

80-101: About section: copy polish.

Minor English/style improvements for clarity.

-            <h3>
-                Hello! I am Nehemías Mosqueda. A web programmer ready for new 
-                experiences and learning.
-            </h3>
+            <h3>
+                Hello! I’m Nehemías Mosqueda — a web developer ready for new
+                experiences and continuous learning.
+            </h3>
@@
-                This site is made to collect personal experiences regarding
-                my professional profile.
+                This site showcases my professional profile and selected projects.
@@
-                I hope that the information you see here is useful. If you need any of my services, 
-                do not hesitate to contact me.
+                I hope you find this information useful. If you need any of my services,
+                feel free to get in touch.

144-191: Tech icons: improve accessibility.

Icon-only elements with title attributes aren’t reliably announced by screen readers. For non-interactive decorative icons, set aria-hidden="true"; for meaningful ones, add visually hidden text.

Example:

-                    <i class='bx bxl-html5' title="HTML5"></i>
+                    <i class='bx bxl-html5' aria-hidden="true"></i><span class="sr-only">HTML5</span>

Alternatively, wrap each group with aria-label and mark inner icons aria-hidden="true".


227-227: Heading style: remove empty span or provide content.

Projects renders an empty accent element; consider “My Projects” or remove the span.

-        <h2 class="heading">Projects <span></span></h2>
+        <h2 class="heading">My <span>Projects</span></h2>

231-231: Performance: lazy-load non-critical images and add dimensions.

Prevent layout shifts and save bandwidth by adding width/height and loading="lazy" (except the LCP image if above the fold).

Example:

-                <img src="images/portada.png" alt="Screenshot of SpaceTrip web game">
+                <img src="images/portada.png" alt="Screenshot of SpaceTrip web game" width="800" height="450" loading="lazy" decoding="async">

Repeat for other project images and about/home images (home hero might remain eager if it’s your LCP).

Also applies to: 243-243, 255-255, 265-265, 277-277, 287-287, 75-75


18-25: Remove Unused Swiper Assets

We ran the provided grep and found the following lingering Swiper references:

  • index.html, line 19: <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@9/swiper-bundle.min.css" />
  • index.html, lines 336–337:
    <!-- swiper js -->
    <script src="https://cdn.jsdelivr.net/npm/swiper@9/swiper-bundle.min.js"></script>
  • README.md, line 25: Swiper listed under “Recursos Externos Utilizados”

Since Swiper is no longer used anywhere in the JS, please remove:

  • The Swiper CSS include (index.html, line 19)
  • The Swiper JS include (index.html, lines 336–337)
  • The Swiper entry in README.md (line 25)

Let me know if you'd like me to open a follow-up patch removing these and re-verifying that no references remain.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 57aef2e and 1e18544.

⛔ Files ignored due to path filters (2)
  • documents/coverletter.pdf is excluded by !**/*.pdf
  • images/favicon.png is excluded by !**/*.png
📒 Files selected for processing (2)
  • index.html (5 hunks)
  • js/script.js (4 hunks)
🧰 Additional context used
🪛 Gitleaks (8.27.2)
index.html

315-315: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

🔇 Additional comments (5)
js/script.js (3)

2-3: Good change: make static DOM references immutable.

Using const for menuIcon and navbar is correct and prevents accidental reassignment.


64-64: ScrollReveal targets updated correctly.

Adding .technologies-container and .certificates-container aligns with the new sections in index.html.


66-66: LGTM: Right-origin targets expanded.

Consistent with the page structure; no functional issues spotted.

index.html (2)

338-339: Confirmed: No reCAPTCHA secret committed

  • The only reCAPTCHA key in the repo is the public site key on index.html (line 315), which is safe to expose.
  • A regex search for “secret” patterns and private-key-like strings returned no results.

Ensure your backend stores the reCAPTCHA secret in a secure environment variable (or secret manager) and performs server-side verification of the g-recaptcha-response.


66-66: Referenced PDF files verified
Both documents/curriculum.pdf and documents/coverletter.pdf exist in the documents/ directory, so the <a> tags on lines 66 and 99 of index.html will resolve correctly. No further action required.

index.html Outdated
Comment on lines 51 to 59
<h3>Hi! I am</h3>
<h1 class="title">Nehemías Mosqueda</h1>
<p>
I'm a web developer who loves to create beautiful and functional websites
for people who want to make a difference in the world.
I am a passionate about programming that specializes the most in languages like
HTML, css, JavaScript, C #, react, etc.
</p>
<p>Currently I'm a student of The Jump Digital School, where I'm learning how to
create beautiful and functional websites using HTML, CSS, JavaScript, and WordPress.</p>
<p>Lately I am in the third year of the Bachelor's degree of Video Game Production and Digital Entertainment
at the National University of Rafaela (UNRaf).</p>

Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Public copy: grammar and capitalization fixes.

These sentences have grammar/case issues (css → CSS, C # → C#, react → React) and could read more naturally.

Suggested edits:

-            <h3>Hi! I am</h3>
+            <h3>Hi! I’m</h3>
@@
-                I am a passionate about programming that specializes the most in languages like 
-                HTML, css, JavaScript, C #, react, etc. 
+                I am passionate about programming, specializing in technologies such as
+                HTML, CSS, JavaScript, C#, React, and more.
@@
-            <p>Lately I am in the third year of the Bachelor's degree of Video Game Production and Digital Entertainment
-                 at the National University of Rafaela (UNRaf).</p>
+            <p>I am currently in my third year of the Bachelor’s degree in Video Game Production and Digital Entertainment
+               at the National University of Rafaela (UNRaf).</p>
📝 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
<h3>Hi! I am</h3>
<h1 class="title">Nehemías Mosqueda</h1>
<p>
I'm a web developer who loves to create beautiful and functional websites
for people who want to make a difference in the world.
I am a passionate about programming that specializes the most in languages like
HTML, css, JavaScript, C #, react, etc.
</p>
<p>Currently I'm a student of The Jump Digital School, where I'm learning how to
create beautiful and functional websites using HTML, CSS, JavaScript, and WordPress.</p>
<p>Lately I am in the third year of the Bachelor's degree of Video Game Production and Digital Entertainment
at the National University of Rafaela (UNRaf).</p>
<h3>Hi! I’m</h3>
<h1 class="title">Nehemías Mosqueda</h1>
<p>
I am passionate about programming, specializing in technologies such as
HTML, CSS, JavaScript, C#, React, and more.
</p>
<p>I am currently in my third year of the Bachelor’s degree in Video Game Production and Digital Entertainment
at the National University of Rafaela (UNRaf).</p>
🤖 Prompt for AI Agents
In index.html around lines 51 to 59, the bio text has capitalization and grammar
issues and reads awkwardly; change "css" to "CSS", "C #" to "C#", "react" to
"React", remove the extra "a" in "I am a passionate about programming", and
rephrase the two <p> blocks for clarity and natural English (for example: "I am
passionate about programming and specialize in HTML, CSS, JavaScript, C#, and
React." and "I am currently in the third year of the Bachelor's degree in Video
Game Production and Digital Entertainment at the National University of Rafaela
(UNRaf)."). Ensure punctuation and spacing are fixed as well.

Comment on lines +109 to +139
<i class='bx bx-paint'></i>
<h3>Basic</h3>
<p>Basic and Functional Landing Page</p>
<ul>
<li><b>Technologies:</b> HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
<li><b>Includes:</b> 1 page, functional site, responsive design, 14 days delivery, 2 revisions</li>
<li><b>Price:</b> 95 USD</li>
</ul>
</div>
<div class="services-box">
<i class='bx bxs-paint'></i>
<h3>Graphic Design</h3>
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Excepturi itaque similique, architecto
eaque ut quas delectus pariatur nesciunt in eligendi mollitia dicta.</p>
<a href="#" class="btn">Read More</a>
<i class='bx bx-code-block'></i>
<h3>Standard</h3>
<p>
Funcional Website (3-5 Pages)
</p>
<ul>
<li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
<li><b>Includes:</b> 3-5 pages, functional site, responsive design, 14 days delivery, 4 revisions</li>
<li><b>Price:</b> 195 USD</li>
</ul>
</div>
<div class="services-box">
<i class='bx bx-bar-chart-alt'></i>
<h3>Digital Marketing</h3>
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Excepturi itaque similique, architecto
eaque ut quas delectus pariatur nesciunt in eligendi mollitia dicta.</p>
<a href="#" class="btn">Read More</a>
<i class='bx bx-diamond'></i>
<h3>Premium </h3>
<p>Pro Website Design (5-10 Pages)</p>
<ul>
<li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
<li><b>Includes:</b> 5-10 pages, functional site, responsive design, 7 days delivery, 5 revisions</li>
<li><b>Price:</b> 295 USD</li>
</ul>
</div>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Services cards: fix typos and standardize tech names.

Examples: “Funcional” → “Functional”, “Javascript” → “JavaScript”, missing spaces after colons.

-                <p>Basic and Functional Landing Page</p>
+                <p>Basic and functional landing page</p>
@@
-                    <li><b>Technologies:</b> HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
+                    <li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>
@@
-                <p>
-Funcional Website (3-5 Pages)
-</p>
+                <p>Functional website (3–5 pages)</p>
@@
-                    <li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
+                    <li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>
@@
-                    <li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
+                    <li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>
📝 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
<i class='bx bx-paint'></i>
<h3>Basic</h3>
<p>Basic and Functional Landing Page</p>
<ul>
<li><b>Technologies:</b> HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
<li><b>Includes:</b> 1 page, functional site, responsive design, 14 days delivery, 2 revisions</li>
<li><b>Price:</b> 95 USD</li>
</ul>
</div>
<div class="services-box">
<i class='bx bxs-paint'></i>
<h3>Graphic Design</h3>
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Excepturi itaque similique, architecto
eaque ut quas delectus pariatur nesciunt in eligendi mollitia dicta.</p>
<a href="#" class="btn">Read More</a>
<i class='bx bx-code-block'></i>
<h3>Standard</h3>
<p>
Funcional Website (3-5 Pages)
</p>
<ul>
<li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
<li><b>Includes:</b> 3-5 pages, functional site, responsive design, 14 days delivery, 4 revisions</li>
<li><b>Price:</b> 195 USD</li>
</ul>
</div>
<div class="services-box">
<i class='bx bx-bar-chart-alt'></i>
<h3>Digital Marketing</h3>
<p>Lorem ipsum dolor sit amet consectetur, adipisicing elit. Excepturi itaque similique, architecto
eaque ut quas delectus pariatur nesciunt in eligendi mollitia dicta.</p>
<a href="#" class="btn">Read More</a>
<i class='bx bx-diamond'></i>
<h3>Premium </h3>
<p>Pro Website Design (5-10 Pages)</p>
<ul>
<li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
<li><b>Includes:</b> 5-10 pages, functional site, responsive design, 7 days delivery, 5 revisions</li>
<li><b>Price:</b> 295 USD</li>
</ul>
</div>
<div class="services-box">
<i class='bx bx-paint'></i>
<h3>Basic</h3>
<p>Basic and functional landing page</p>
<ul>
<li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>
<li><b>Includes:</b> 1 page, functional site, responsive design, 14 days delivery, 2 revisions</li>
<li><b>Price:</b> 95 USD</li>
</ul>
</div>
<div class="services-box">
<i class='bx bx-code-block'></i>
<h3>Standard</h3>
<p>Functional website (3–5 pages)</p>
<ul>
<li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>
<li><b>Includes:</b> 3-5 pages, functional site, responsive design, 14 days delivery, 4 revisions</li>
<li><b>Price:</b> 195 USD</li>
</ul>
</div>
<div class="services-box">
<i class='bx bx-diamond'></i>
<h3>Premium </h3>
<p>Pro Website Design (5-10 Pages)</p>
<ul>
<li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>
<li><b>Includes:</b> 5-10 pages, functional site, responsive design, 7 days delivery, 5 revisions</li>
<li><b>Price:</b> 295 USD</li>
</ul>
</div>
🤖 Prompt for AI Agents
In index.html around lines 109 to 139, several typos and inconsistent tech-name
capitalization/spacing exist across the service cards; correct "Funcional" to
"Functional", change "Javascript" to "JavaScript" everywhere, ensure there is a
space after each colon (e.g. "Technologies: HTML" and "Includes: 1 page"), and
standardize comma/space formatting in the technology lists so all items use
consistent spacing and punctuation.

Comment on lines +231 to 241
<img src="images/portada.png" alt="Screenshot of SpaceTrip web game">

<div class="portfolio-layer">
<h4>Web Design</h4>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit. Similique, ipsam est.</p>
<a href="#"><i class='bx bx-link-external'></i></a>
<h4>SpaceTrip</h4>
<p>SpaceTrip is a web game where you are an astronaut who has to collect stars and avoid asteroids.
The game features a simple and intuitive interface, with colorful graphics and sound effects.
It is designed to be fun and challenging for players of all ages.
</p>
<a href="https://spacetrip-2023.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
</div>
</div>
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Project links: secure and accessible external anchors.

Add rel="noopener noreferrer" to all target="_blank" project links and give icon-only anchors aria-labels.

-                    <a href="https://spacetrip-2023.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://spacetrip-2023.netlify.app" target="_blank" rel="noopener noreferrer" aria-label="Open SpaceTrip project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://deep-ambition.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://deep-ambition.netlify.app" target="_blank" rel="noopener noreferrer" aria-label="Open Deep Ambition project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://climapp-2025.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://climapp-2025.netlify.app" target="_blank" rel="noopener noreferrer" aria-label="Open ClimAPP project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://codepen.io/DanGames520/full/ByNejJq" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://codepen.io/DanGames520/full/ByNejJq" target="_blank" rel="noopener noreferrer" aria-label="Open Drum Pad Machine project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://codepen.io/DanGames520/full/PwqvzPz" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://codepen.io/DanGames520/full/PwqvzPz" target="_blank" rel="noopener noreferrer" aria-label="Open Calculator project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://codepen.io/DanGames520/full/NPWQyOr" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://codepen.io/DanGames520/full/NPWQyOr" target="_blank" rel="noopener noreferrer" aria-label="Open Markdown Previewer project"><i class='bx bx-link-external' aria-hidden="true"></i></a>

Also applies to: 243-251, 255-262, 265-273, 277-285, 287-295

🤖 Prompt for AI Agents
In index.html around lines 231-241 (and also apply same changes to 243-251,
255-262, 265-273, 277-285, 287-295): anchor tags that open in a new tab
(target="_blank") lack rel="noopener noreferrer" and the icon-only anchors have
no accessible label. For each external link with target="_blank" add
rel="noopener noreferrer" to prevent window.opener attacks and performance
issues, and add an appropriate aria-label (e.g., aria-label="Open SpaceTrip in
new tab") to every anchor that contains only an icon so screen readers can
describe the link; keep existing target attributes and ensure labels are concise
and unique per project link.

js/script.js Outdated
Comment on lines 68 to 80
const contactForm = document.querySelector('.contact form');
if (contactForm) {
contactForm.addEventListener('submit', function (e) {
if (typeof grecaptcha !== 'undefined') {
const response = grecaptcha.getResponse();
if (response.length === 0) {
e.preventDefault();
alert('Please complete the CAPTCHA before submitting.');
}
}
});
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Improve CAPTCHA UX and fail-closed when the widget is present but not loaded.

  • If the reCAPTCHA script fails to load while the widget is on the page, the form currently submits. Consider blocking submit in that case to avoid backend errors.
  • Prefer inline, accessible feedback over alert().
  • Optionally disable the submit button until CAPTCHA is solved to reduce retries.

Apply this diff to strengthen validation and provide inline feedback:

 /*========== captcha validation ==========*/
 const contactForm = document.querySelector('.contact form');
 if (contactForm) {
-    contactForm.addEventListener('submit', function (e) {
-        if (typeof grecaptcha !== 'undefined') {
-            const response = grecaptcha.getResponse();
-            if (response.length === 0) {
-                e.preventDefault();
-                alert('Please complete the CAPTCHA before submitting.');
-            }
-        }
-    });
+    const captchaContainer = contactForm.querySelector('.g-recaptcha');
+    let captchaError = contactForm.querySelector('.captcha-error');
+    if (!captchaError) {
+        captchaError = document.createElement('p');
+        captchaError.className = 'captcha-error';
+        captchaError.style.color = '#e53935';
+        captchaError.style.marginTop = '8px';
+        captchaContainer?.after(captchaError);
+    }
+    contactForm.addEventListener('submit', (e) => {
+        const widgetPresent = Boolean(captchaContainer);
+        const hasGrecaptcha = typeof window.grecaptcha !== 'undefined';
+        let solved = false;
+        if (widgetPresent && hasGrecaptcha) {
+            const response = window.grecaptcha.getResponse();
+            solved = response && response.length > 0;
+        }
+        if (widgetPresent && !solved) {
+            e.preventDefault();
+            captchaError.textContent = 'Please complete the CAPTCHA before submitting.';
+            captchaError.setAttribute('role', 'alert');
+            captchaError.setAttribute('aria-live', 'assertive');
+        } else {
+            captchaError.textContent = '';
+        }
+    });
 }

Optionally, add a grecaptcha callback in HTML (data-callback) to enable/disable the submit button when solved—happy to draft that if you want.

📝 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
/*========== captcha validation ==========*/
const contactForm = document.querySelector('.contact form');
if (contactForm) {
contactForm.addEventListener('submit', function (e) {
if (typeof grecaptcha !== 'undefined') {
const response = grecaptcha.getResponse();
if (response.length === 0) {
e.preventDefault();
alert('Please complete the CAPTCHA before submitting.');
}
}
});
}
/*========== captcha validation ==========*/
const contactForm = document.querySelector('.contact form');
if (contactForm) {
const captchaContainer = contactForm.querySelector('.g-recaptcha');
let captchaError = contactForm.querySelector('.captcha-error');
if (!captchaError) {
captchaError = document.createElement('p');
captchaError.className = 'captcha-error';
captchaError.style.color = '#e53935';
captchaError.style.marginTop = '8px';
captchaContainer?.after(captchaError);
}
contactForm.addEventListener('submit', (e) => {
const widgetPresent = Boolean(captchaContainer);
const hasGrecaptcha = typeof window.grecaptcha !== 'undefined';
let solved = false;
if (widgetPresent && hasGrecaptcha) {
const response = window.grecaptcha.getResponse();
solved = response && response.length > 0;
}
if (widgetPresent && !solved) {
e.preventDefault();
captchaError.textContent = 'Please complete the CAPTCHA before submitting.';
captchaError.setAttribute('role', 'alert');
captchaError.setAttribute('aria-live', 'assertive');
} else {
captchaError.textContent = '';
}
});
}
🤖 Prompt for AI Agents
In js/script.js around lines 68 to 80, the form currently uses alert() and only
blocks submit when grecaptcha is defined and returns an empty response, which
lets the form submit if the reCAPTCHA script/widget is present but fails to
load; change the logic to: detect whether a reCAPTCHA widget element exists on
the page and treat an unloaded grecaptcha as a failing state (prevent submit),
replace alert() with an inline, ARIA-live error element and set its textContent
and aria-hidden appropriately, and disable the form submit button by default
when a widget is present then re-enable it via a grecaptcha callback (or when
grecaptcha.getResponse() returns non-empty) so the form is fail-closed and
provides accessible inline feedback.

Copy link

@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: 0

♻️ Duplicate comments (7)
index.html (7)

51-58: Public copy: grammar, capitalization, and style improvements.

Improve readability and correct tech names (CSS, React), contractions, and phrasing.

-            <h3>Hi! I am</h3>
+            <h3>Hi! I’m</h3>
@@
-                I am a passionate about programming that specializes the most in languages like 
-                HTML, css, JavaScript, react, etc. 
+                I am passionate about programming, specializing in technologies such as
+                HTML, CSS, JavaScript, React, and more.
@@
-            <p>Lately I am in the third year of the Bachelor's degree of Video Game Production and Digital Entertainment
-                 at the National University of Rafaela (UNRaf).</p>
+            <p>I am currently in my third year of the Bachelor’s degree in Video Game Production and Digital Entertainment
+               at the National University of Rafaela (UNRaf).</p>

109-139: Services cards: typos, standardize tech names, spacing, and punctuation.

Fix “Funcional”, “Javascript”, and ensure spaces after colons; standardize casing.

-                <p>Basic and Functional Landing Page</p>
+                <p>Basic and functional landing page</p>
@@
-                    <li><b>Technologies:</b> HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
+                    <li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>
@@
-                <p>
-Funcional Website (3-5 Pages)
-</p>
+                <p>Functional website (3–5 pages)</p>
@@
-                    <li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
+                    <li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>
@@
-                <h3>Premium </h3>
+                <h3>Premium</h3>
@@
-                    <li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
+                    <li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>

Optional: consider removing hard-coded prices or clarifying currency and update policy.


61-63: Secure external links, fix mailto, add accessible labels for icon-only anchors.

  • Remove the space after mailto:.
  • Add rel="noopener noreferrer" to target="_blank".
  • Provide aria-labels for icon-only links.
-                <a href="mailto: [email protected]"><i class='bx bxl-gmail'></i></a>
-                <a href="https://github.com/Nehemimosqueda520" target="_blank"><i class='bx bxl-github'></i></a>
-                <a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/" target="_blank"><i class='bx bxl-linkedin'></i></a>
+                <a href="mailto:[email protected]" aria-label="Email Nehemías"><i class='bx bxl-gmail' aria-hidden="true"></i></a>
+                <a href="https://github.com/Nehemimosqueda520" target="_blank" rel="noopener noreferrer" aria-label="GitHub profile"><i class='bx bxl-github' aria-hidden="true"></i></a>
+                <a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn profile"><i class='bx bxl-linkedin' aria-hidden="true"></i></a>

197-221: External certificate links: add rel for security.

Add rel="noopener noreferrer" to each target="_blank" link.

-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/responsive-web-design" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/responsive-web-design" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/javascript-algorithms-and-data-structures-v8" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/javascript-algorithms-and-data-structures-v8" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/front-end-development-libraries" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/front-end-development-libraries" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/data-visualization" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/data-visualization" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>

227-295: Project external links: secure and accessible anchors.

Add rel="noopener noreferrer" and aria-labels; mark icons aria-hidden.

-                    <a href="https://spacetrip-2023.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://spacetrip-2023.netlify.app" target="_blank" rel="noopener noreferrer" aria-label="Open SpaceTrip project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://deep-ambition.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://deep-ambition.netlify.app" target="_blank" rel="noopener noreferrer" aria-label="Open Deep Ambition project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://climapp-2025.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://climapp-2025.netlify.app" target="_blank" rel="noopener noreferrer" aria-label="Open ClimAPP project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://codepen.io/DanGames520/full/ByNejJq" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://codepen.io/DanGames520/full/ByNejJq" target="_blank" rel="noopener noreferrer" aria-label="Open Drum Pad Machine project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://codepen.io/DanGames520/full/PwqvzPz" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://codepen.io/DanGames520/full/PwqvzPz" target="_blank" rel="noopener noreferrer" aria-label="Open Calculator project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://codepen.io/DanGames520/full/NPWQyOr" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://codepen.io/DanGames520/full/NPWQyOr" target="_blank" rel="noopener noreferrer" aria-label="Open Markdown Previewer project"><i class='bx bx-link-external' aria-hidden="true"></i></a>

303-317: Contact form: labels, autocomplete, and minor wording.

  • Placeholder-only inputs need labels for accessibility.
  • Add autocomplete and inputmode; “Mail” → “Email”.
  • Consider making phone optional unless truly required.
-        <h2 class="heading">Contact<span> Me!</span></h2>
+        <h2 class="heading">Contact <span>Me!</span></h2>
@@
-            <div class="input-box">
-                <input type="text" name="name" placeholder="Full Name" required>
-                <input type="email" name="email" placeholder="Mail" required>
-            </div>
+            <div class="input-box">
+                <label for="name" class="sr-only">Full name</label>
+                <input id="name" type="text" name="name" placeholder="Full name" autocomplete="name" required>
+                <label for="email" class="sr-only">Email</label>
+                <input id="email" type="email" name="email" placeholder="Email" autocomplete="email" inputmode="email" required>
+            </div>
@@
-            <div class="input-box">
-                <input type="tel" name="phone" placeholder="Phone Number" required>
-            </div>
+            <div class="input-box">
+                <label for="phone" class="sr-only">Phone number</label>
+                <input id="phone" type="tel" name="phone" placeholder="Phone number" autocomplete="tel" inputmode="tel">
+            </div>
@@
-            <textarea name="message" cols="30" rows="10" placeholder="Message" required></textarea>
+            <label for="message" class="sr-only">Message</label>
+            <textarea id="message" name="message" cols="30" rows="10" placeholder="Message" required></textarea>

If you want, I can add CSS for a .sr-only utility.


239-239: Ensure all <a target="_blank"> anchors include rel="noopener noreferrer" to prevent security and performance issues

The following anchor tags in index.html open in a new tab without the recommended rel attributes. Please update each to include rel="noopener noreferrer".

• index.html line 62
• index.html line 63
• index.html line 202
• index.html line 208
• index.html line 214
• index.html line 220
• index.html line 239
• index.html line 250
• index.html line 260
• index.html line 271
• index.html line 283
• index.html line 294

Example diff for line 239:

-   <a href="https://spacetrip-2023.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
+   <a href="https://spacetrip-2023.netlify.app" target="_blank" rel="noopener noreferrer"><i class='bx bx-link-external'></i></a>

Apply the same change to all other instances listed above.

🧹 Nitpick comments (6)
index.html (6)

8-17: Metadata polish: canonical/OG completeness and absolute URLs.

  • Add og:url and Twitter Card tags for richer sharing.
  • Use absolute URL for og:image (recommended 1200×630) and ensure the canonical points to your definitive production URL.

Proposed patch:

     <meta property="og:type" content="website">
-    <meta property="og:image" content="images/home.png">
-    <link rel="canonical" href="https://portfolio-nehemias.netlify.app/">
+    <meta property="og:image" content="https://portfolio-nehemias.netlify.app/images/home.png">
+    <meta property="og:url" content="https://portfolio-nehemias.netlify.app/">
+    <meta name="twitter:card" content="summary_large_image">
+    <meta name="twitter:title" content="Nehemías Mosqueda Portfolio">
+    <meta name="twitter:description" content="Nehemías Mosqueda's professional portfolio showcasing web development projects and services.">
+    <meta name="twitter:image" content="https://portfolio-nehemias.netlify.app/images/home.png">
+    <link rel="canonical" href="https://portfolio-nehemias.netlify.app/">

18-23: Remove Swiper assets if Swiper was removed.

CDN CSS/JS for Swiper are still included but Swiper is no longer used per PR summary. Remove to cut requests and bytes. Also consider adding SRI for remaining CDNs.

-    <!-- swiper css -->
-    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@9/swiper-bundle.min.css" />
@@
-    <!-- swiper js -->
-    <script src="https://cdn.jsdelivr.net/npm/swiper@9/swiper-bundle.min.js"></script>
+    <!-- Consider adding Subresource Integrity (SRI) to external assets -->
+    <!-- example:
+    <script src="https://unpkg.com/scrollreveal" integrity="sha384-..." crossorigin="anonymous"></script>
+    -->

Also applies to: 336-337


88-99: About copy: clarity and tone.

Minor phrasing tweaks to read more naturally in English.

-                Hello! I am Nehemías Mosqueda. A web programmer ready for new 
-                experiences and learning.
+                Hello! I’m Nehemías Mosqueda, a web developer eager for new
+                experiences and continuous learning.
@@
-                This site is made to collect personal experiences regarding
-                my professional profile.
+                This site showcases my work, skills, and experience.
@@
-                I hope that the information you see here is useful. If you need any of my services, 
-                do not hesitate to contact me.
+                I hope you find this information useful. If you need any of my services,
+                don’t hesitate to contact me.

145-191: Accessibility of technology icons.

The icon groups are visual; consider adding aria-hidden="true" to decorative icons and a visually hidden label for the group. Also add role and aria-label to the inline SVG for D3.

-                <div class="tech-icons">
-                    <i class='bx bxl-html5' title="HTML5"></i>
+                <div class="tech-icons" aria-label="Front-end technologies">
+                    <i class='bx bxl-html5' title="HTML5" aria-hidden="true"></i>
@@
-                    <svg class="d3-icon" title="D3.js" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
+                    <svg class="d3-icon" role="img" aria-label="D3.js" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">

Repeat aria-hidden="true" on other icons in Back-end/Design groups.


321-329: Minor: add aria-label to “back to top” icon-only link.

Improves accessibility for screen readers.

-            <a href="#home"><i class='bx bx-up-arrow-alt'></i></a>
+            <a href="#home" aria-label="Back to top"><i class='bx bx-up-arrow-alt' aria-hidden="true"></i></a>

33-41: Consistency: nav label casing.

Use “Contact Me” to match heading and title case elsewhere.

-            <a href="#contact">Contact me</a>
+            <a href="#contact">Contact Me</a>
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 1e18544 and 714a27a.

📒 Files selected for processing (1)
  • index.html (5 hunks)
🧰 Additional context used
🪛 Gitleaks (8.27.2)
index.html

315-315: Detected a Generic API Key, potentially exposing access to various services and sensitive operations.

(generic-api-key)

🔇 Additional comments (3)
index.html (3)

66-66: Downloadable assets verified

The required PDF assets (documents/curriculum.pdf and documents/coverletter.pdf) are present in the repository and will be served correctly—no missing files detected. No further changes are needed.


315-315: ✅ No secrets detected; reCAPTCHA site key is safe

I ran a repository-wide search for secrets (e.g. “secret”, “api_key”, “token” patterns) with ripgrep and found no matches, confirming that no Formspree or reCAPTCHA secret keys have been committed. The client‐side site key in index.html (line 315) is public by design.

• If you’d like to suppress future gitleaks warnings, consider adding an inline comment as shown below.
• Otherwise, no further action is required—your server‐side secret remains safe.

Optional inline comment:

-            <div class="g-recaptcha" data-sitekey="6LdRJ5QrAAAAAO1MX3IcZSKRzr9ss2f1ZYFz35dO"></div>
+            <!-- reCAPTCHA site key is intentionally public; no secret keys stored here -->
+            <div class="g-recaptcha" data-sitekey="6LdRJ5QrAAAAAO1MX3IcZSKRzr9ss2f1ZYFz35dO"></div>

231-231: Asset existence confirmed – no missing images

All referenced image files under images/ were found in the repository, and each <img> tag includes a valid alt attribute. No broken-asset issues detected.

• Validated paths in index.html:

  • images/about.png
  • images/calculator.png
  • images/drumPad.png
  • images/home.png
  • images/markdown.png
  • images/portada.png
  • images/portada2.png
  • images/sun.png

No further action needed.

Copy link

@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: 0

♻️ Duplicate comments (6)
index.html (6)

51-58: Fix grammar/capitalization in hero copy

Streamline phrasing and standardize tech names.

-            <h3>Hi! I am</h3>
+            <h3>Hi! I’m</h3>
@@
-                I am a passionate about programming that specializes the most in languages like 
-                HTML, css, JavaScript, react, etc. 
+                I am passionate about programming, specializing in technologies such as
+                HTML, CSS, JavaScript, React, and more.
@@
-            <p>Lately I am in the third year of the Bachelor's degree of Video Game Production and Digital Entertainment
-                 at the National University of Rafaela (UNRaf).</p>
+            <p>I am currently in my third year of the Bachelor’s degree in Video Game Production and Digital Entertainment
+               at the National University of Rafaela (UNRaf).</p>

111-138: Services: fix typos, spacing after colons, and tech names

Standardize “JavaScript”, fix “Funcional”, add spaces after colons.

-                <p>Basic and Functional Landing Page</p>
+                <p>Basic and functional landing page</p>
@@
-                    <li><b>Technologies:</b> HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
+                    <li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>
@@
-                <p>
-Funcional Website (3-5 Pages)
-</p>
+                <p>Functional website (3–5 pages)</p>
@@
-                    <li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
+                    <li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>
@@
-                <h3>Premium </h3>
+                <h3>Premium</h3>
@@
-                    <li><b>Technologies:</b>HTML, CSS, Javascript, Styling Libraries, Figma, Webflow</li>
+                    <li><b>Technologies:</b> HTML, CSS, JavaScript, styling libraries, Figma, Webflow</li>

303-315: Contact form: labels, autocomplete, better heading spacing, honeypot

  • Placeholder-only fields aren’t accessible. Add labels and id/for.
  • Add autocomplete/inputmode; change “Mail” → “Email”.
  • Optional: make phone not required.
  • Add a simple honeypot to reduce spam.
-        <h2 class="heading">Contact<span> Me!</span></h2>
+        <h2 class="heading">Contact <span>Me!</span></h2>
@@
-        <form action="https://formspree.io/f/xrblknre" method="POST">
+        <form action="https://formspree.io/f/xrblknre" method="POST">
+            <input type="text" name="_gotcha" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px" aria-hidden="true">
@@
-            <div class="input-box">
-                <input type="text" name="name" placeholder="Full Name" required>
-                <input type="email" name="email" placeholder="Mail" required>
-            </div>
+            <div class="input-box">
+                <label for="name" class="sr-only">Full name</label>
+                <input id="name" type="text" name="name" placeholder="Full name" autocomplete="name" required>
+                <label for="email" class="sr-only">Email</label>
+                <input id="email" type="email" name="email" placeholder="Email" autocomplete="email" inputmode="email" required>
+            </div>
@@
-            <div class="input-box">
-                <input type="tel" name="phone" placeholder="Phone Number" required>
-            </div>
+            <div class="input-box">
+                <label for="phone" class="sr-only">Phone number</label>
+                <input id="phone" type="tel" name="phone" placeholder="Phone number" autocomplete="tel" inputmode="tel">
+            </div>
@@
-            <textarea name="message" cols="30" rows="10" placeholder="Message" required></textarea>
+            <label for="message" class="sr-only">Message</label>
+            <textarea id="message" name="message" cols="30" rows="10" placeholder="Message" required></textarea>

If you want, I can add CSS for .sr-only in css/style.css.

To catch missing labels quickly:

#!/bin/bash
rg -nP '<input(?![^>]*\bid=)' -n -C0
rg -nP '<textarea(?![^>]*\bid=)'

61-63: Secure external links + fix mailto typo + add accessible labels

  • Remove stray space in mailto: URL.
  • Add rel="noopener noreferrer" to target="_blank" links.
  • Provide aria-labels for icon-only links; mark icons aria-hidden.
-                <a href="mailto: [email protected]"><i class='bx bxl-gmail'></i></a>
-                <a href="https://github.com/Nehemimosqueda520" target="_blank"><i class='bx bxl-github'></i></a>
-                <a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/" target="_blank"><i class='bx bxl-linkedin'></i></a>
+                <a href="mailto:[email protected]" aria-label="Email Nehemías"><i class='bx bxl-gmail' aria-hidden="true"></i></a>
+                <a href="https://github.com/Nehemimosqueda520" target="_blank" rel="noopener noreferrer" aria-label="GitHub profile"><i class='bx bxl-github' aria-hidden="true"></i></a>
+                <a href="https://www.linkedin.com/in/nehem%C3%ADas-mosqueda-003063237/" target="_blank" rel="noopener noreferrer" aria-label="LinkedIn profile"><i class='bx bxl-linkedin' aria-hidden="true"></i></a>

Run to catch any remaining issues:

#!/bin/bash
rg -nP '<a[^>]+target="_blank"(?![^>]*\brel=)' -C1
rg -nP 'mailto:\s' -n

197-221: Certificates: add rel to external links

Add rel="noopener noreferrer" to all target="_blank" buttons.

-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/responsive-web-design" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/responsive-web-design" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/javascript-algorithms-and-data-structures-v8" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/javascript-algorithms-and-data-structures-v8" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/front-end-development-libraries" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/front-end-development-libraries" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>
@@
-                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/data-visualization" class="btn" target="_blank">See Certificate</a>
+                <a href="https://www.freecodecamp.org/certification/NehemiasMosqueda/data-visualization" class="btn" target="_blank" rel="noopener noreferrer">See Certificate</a>

239-239: Projects: secure and label external anchors

Add rel to target="_blank" and aria-label for icon-only anchors; mark icons aria-hidden.

-                    <a href="https://spacetrip-2023.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://spacetrip-2023.netlify.app" target="_blank" rel="noopener noreferrer" aria-label="Open SpaceTrip project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://deep-ambition.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://deep-ambition.netlify.app" target="_blank" rel="noopener noreferrer" aria-label="Open Deep Ambition project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://climapp-2025.netlify.app" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://climapp-2025.netlify.app" target="_blank" rel="noopener noreferrer" aria-label="Open ClimAPP project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://codepen.io/DanGames520/full/ByNejJq" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://codepen.io/DanGames520/full/ByNejJq" target="_blank" rel="noopener noreferrer" aria-label="Open Drum Pad Machine project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://codepen.io/DanGames520/full/PwqvzPz" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://codepen.io/DanGames520/full/PwqvzPz" target="_blank" rel="noopener noreferrer" aria-label="Open Calculator project"><i class='bx bx-link-external' aria-hidden="true"></i></a>
@@
-                    <a href="https://codepen.io/DanGames520/full/NPWQyOr" target="_blank"><i class='bx bx-link-external'></i></a>
+                    <a href="https://codepen.io/DanGames520/full/NPWQyOr" target="_blank" rel="noopener noreferrer" aria-label="Open Markdown Previewer project"><i class='bx bx-link-external' aria-hidden="true"></i></a>

Also applies to: 250-250, 260-260, 271-271, 283-283, 294-294

🧹 Nitpick comments (9)
index.html (9)

8-17: SEO/OG polish: make og:image absolute, add og:url + Twitter cards

  • Use an absolute URL for og:image so social scrapers can fetch it.
  • Add og:url matching the canonical.
  • Consider basic Twitter card tags and theme-color.
-    <meta property="og:image" content="images/home.png">
+    <meta property="og:image" content="https://portfolio-nehemias.netlify.app/images/home.png">
+    <meta property="og:url" content="https://portfolio-nehemias.netlify.app/">
+    <meta name="theme-color" content="#0ef">
+    <meta name="twitter:card" content="summary_large_image">
+    <meta name="twitter:title" content="Nehemías Mosqueda Portfolio">
+    <meta name="twitter:description" content="Nehemías Mosqueda's professional portfolio showcasing web development projects and services.">
+    <meta name="twitter:image" content="https://portfolio-nehemias.netlify.app/images/home.png">

18-20: Swiper still included though AI summary says it was removed

If Swiper is no longer used, drop the CSS/JS to save requests. If still used, keep it and ignore this.

-    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@9/swiper-bundle.min.css" />
@@
-    <script src="https://cdn.jsdelivr.net/npm/swiper@9/swiper-bundle.min.js"></script>

Also applies to: 335-336


66-66: Minor: hint the filetype for CV download

Optional, but can help some UAs.

-            <a href="documents/curriculum.pdf" class="btn" download>Download CV</a>
+            <a href="documents/curriculum.pdf" class="btn" type="application/pdf" download>Download CV</a>

80-101: About copy tweaks + filetype hint for cover letter

Polish phrasing and add type attribute to the PDF link.

-            <h3>
-                Hello! I am Nehemías Mosqueda. A web programmer ready for new 
-                experiences and learning.
-            </h3>
+            <h3>Hello! I’m Nehemías Mosqueda — a web developer ready for new experiences and learning.</h3>
@@
-            <a href="documents/coverletter.pdf" class="btn" download>Cover Letter</a>
+            <a href="documents/coverletter.pdf" class="btn" type="application/pdf" download>Cover Letter</a>

157-170: SVG accessibility: use <title> and aria-labelledby instead of title attribute

Inline SVG’s title attribute isn’t consistently exposed. Provide an accessible name via <title> and aria-labelledby.

-                    <svg class="d3-icon" title="D3.js" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
+                    <svg class="d3-icon" role="img" aria-labelledby="d3jsTitle" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
+                        <title id="d3jsTitle">D3.js</title>

82-82: Defer offscreen image decoding: add loading="lazy" (keep hero eager)

Add lazy loading to below-the-fold images to improve LCP/bytes. Leave the hero image eager (already is).

-            <img src="images/about.png" alt="Illustration representing Nehemías Mosqueda">
+            <img src="images/about.png" alt="Illustration representing Nehemías Mosqueda" loading="lazy" decoding="async">
@@
-                <img src="images/portada.png" alt="Screenshot of SpaceTrip web game">
+                <img src="images/portada.png" alt="Screenshot of SpaceTrip web game" loading="lazy" decoding="async">
@@
-                <img src="images/portada2.png" alt="Screenshot of Deep Ambition game">
+                <img src="images/portada2.png" alt="Screenshot of Deep Ambition game" loading="lazy" decoding="async">
@@
-                <img src="images/sun.png" alt="Icon of ClimAPP weather app">
+                <img src="images/sun.png" alt="Icon of ClimAPP weather app" loading="lazy" decoding="async">
@@
-                <img src="images/drumPad.png" alt="Screenshot of Drum Pad Machine web app">
+                <img src="images/drumPad.png" alt="Screenshot of Drum Pad Machine web app" loading="lazy" decoding="async">
@@
-                <img src="images/calculator.png" alt="Screenshot of Calculator web app">
+                <img src="images/calculator.png" alt="Screenshot of Calculator web app" loading="lazy" decoding="async">
@@
-                <img src="images/markdown.png" alt="Screenshot of Markdown Previewer web app">
+                <img src="images/markdown.png" alt="Screenshot of Markdown Previewer web app" loading="lazy" decoding="async">

Also applies to: 231-231, 243-243, 255-255, 265-265, 277-277, 288-288


227-227: Remove empty span in Projects heading

The empty span has no visual/accessibility value.

-        <h2 class="heading">Projects <span></span></h2>
+        <h2 class="heading">Projects</h2>

323-323: Year: set current year automatically or update to 2025

Optional, but avoids stale copyright.

-            <p>Copyright &copy; 2023 | All Rights Reserved.</p>
+            <p>Copyright &copy; <span id="year">2025</span> | All Rights Reserved.</p>

And in js/script.js (outside this diff), add:

document.getElementById('year')?.replaceChildren(document.createTextNode(String(new Date().getFullYear())))

333-340: Script loading and integrity

  • Consider adding defer to non-module scripts to avoid blocking.
  • If keeping CDN assets, pin exact versions and add SRI + crossorigin.
-    <script src="https://unpkg.com/scrollreveal"></script>
+    <script src="https://unpkg.com/scrollreveal" defer></script>
@@
-    <script src="js/script.js"></script>
+    <script src="js/script.js" defer></script>

If you keep CDN files, I can help compute SRI hashes once you confirm the exact URLs.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 714a27a and fe7c532.

📒 Files selected for processing (2)
  • index.html (5 hunks)
  • js/script.js (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • js/script.js
🔇 Additional comments (1)
index.html (1)

75-75: LGTM: descriptive hero image alt

Alt text is clear and helpful.

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