Commit Graph

14 Commits

Author SHA1 Message Date
Melvin Ragusa
220b03ad97 Merge branch 'main' into bolt/route-lazy-loading-17202030222576625568 2026-01-29 05:20:57 +01:00
Melvin Ragusa
5745e07da2 Merge branch 'main' into palette-contact-a11y-2847648259567731202 2026-01-29 05:19:59 +01:00
Melvin Ragusa
68727e8b39 Merge pull request #31 from ragusa-it/palette/required-fields-a11y-7470820225000300564
🎨 Palette: Add accessible required field indicators
2026-01-29 05:17:56 +01:00
google-labs-jules[bot]
2c9cb547e7 🎨 Palette: Improve Contact form accessibility
💡 What: Added ARIA roles to form status messages and hid decorative icons.
🎯 Why: Screen readers were missing dynamic success/error messages on form submission.
 Accessibility:
- Added `role="alert"` and `aria-live="polite"` to success, error, and rate-limit messages.
- Added `aria-hidden="true"` to decorative icons in the contact info section.

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-29 01:48:58 +00:00
google-labs-jules[bot]
e14ce38f61 feat: add accessible required field indicators and alerts
- Add visual asterisk for required inputs in Input.tsx
- Add .required style in Input.module.css
- Update Contact form to use required props and noValidate
- Add role="alert" to Contact form success/error messages
- Add tests for required field rendering

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-28 02:10:17 +00:00
google-labs-jules[bot]
669e96a77c feat: optimize Hero component by isolating typing effect state
Extracted the high-frequency typing animation logic into a new, memoized `TypedText` component.
This prevents the entire `Hero` component (including the heavy `GradientBlinds`) from re-rendering on every character update.

- Created `TypedText` component in `Hero.tsx`
- Wrapped `TypedText` in `React.memo`
- Moved `useTypingEffect` call into `TypedText`
- Updated `Hero` to use `TypedText`

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-28 01:58:55 +00:00
google-labs-jules[bot]
57f7c5667f 🛡️ Sentinel: [HIGH] Implement strict email validation
- Implemented `isValidEmail` utility with strict regex validation (rejects `<` and `>`) to prevent XSS vectors.
- Updated `Contact.tsx` to use `isValidEmail` instead of weak regex.
- Added comprehensive tests for `isValidEmail` in `src/utils/security.test.ts`.
- Fixed flaky test in `src/pages/__tests__/Contact.test.tsx` by clearing `localStorage` in `afterEach`.
- Added test case for invalid email submission.
- Documented findings in `.jules/sentinel.md`.

Co-authored-by: ragusa-it <196988693+ragusa-it@users.noreply.github.com>
2026-01-27 01:56:08 +00:00
google-labs-jules[bot]
839e1bf82f feat: add client-side rate limiting to contact form
- Added `useRateLimit` hook
- Integrated hook into `Contact.tsx`
- Added translations for rate limit error
- Added unit tests
- Fixed type error in `Button.tsx` to allow build to pass
2026-01-26 01:49:05 +00:00
google-labs-jules[bot]
0fe47a3790 feat(perf): implement route lazy loading for About and Contact pages
- Splits About and Contact pages into separate chunks using React.lazy and Suspense.
- Keeps Home page eager loaded to prevent layout shifts.
- Adds PageLoader component as a fallback for Suspense.
- Reduces initial bundle size by loading secondary pages only when needed.
2026-01-26 01:41:35 +00:00
Melvin Ragusa
13df58342a Merge pull request #22 from ragusa-it/bolt-optimize-fancycursor-3615259032599906398
 Bolt: Optimize FancyCursor mousemove handler
2026-01-25 15:16:27 +01:00
google-labs-jules[bot]
7c0a0bbec2 perf(FancyCursor): optimize mousemove handler with ticking pattern
- Replaces the `cancelAnimationFrame` pattern with a boolean ticking flag to reduce function allocation and RAF overhead on high-frequency mousemove events.
- Uses closure variables for coordinates to ensure the latest position is used in the animation frame.
- Improves performance of the custom cursor on high-refresh-rate input devices.
2026-01-25 01:37:50 +00:00
google-labs-jules[bot]
5f7f422167 🛡️ Sentinel: [HIGH] Add security headers to firebase.json
Added strict security headers to `firebase.json` for Firebase Hosting.
Headers included:
- X-Content-Type-Options: nosniff
- X-Frame-Options: DENY
- Referrer-Policy: strict-origin-when-cross-origin
- Content-Security-Policy: Includes directives for 'self', Google Fonts, EmailJS, and disallows object/frame embedding.

Also initialized `.jules/sentinel.md` with the first security learning.
2026-01-25 01:35:53 +00:00
Melvin Ragusa
b80db420c2 jules: merged .jules and .Jules directories 2026-01-24 11:50:38 +01:00
google-labs-jules[bot]
6801682c2e Shield: Add input sanitization and length validation to Contact form
Added `sanitizeInput` utility to escape HTML characters.
Updated `Contact.tsx` to sanitize inputs before sending via `emailjs`.
Added max length validation for Name (100), Subject (200), and Message (5000).
Updated tests to cover sanitization and validation logic, including adding `cleanup()` to prevent test leakage.
2026-01-24 10:05:33 +00:00